在linux中进行arm交叉编译体验tiny6410裸机程序开发流程
在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。
1. 交叉编译器安装
按照光盘A中的文档《04- Tiny6410 Linux开发指南.pdf》的 1.3.5 节描述,用光盘中的 arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz 文件解压后运行命令 arm-linux-gcc -v 得到的结果是:
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-linux-gcc
bash: ./arm-linux-gcc: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-none-linux-gnueabi-gcc
bash: ./arm-none-linux-gnueabi-gcc: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-none-linux-gnueabi-cpp
bash: ./arm-none-linux-gnueabi-cpp: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ ./arm-none-linux-gnueabi-gcc
bash: ./arm-none-linux-gnueabi-gcc: No such file or directory
faund@faund-Virtual-Machine:/opt/FriendlyARM/toolschain/4.5.1/bin$ sudo ./arm-none-linux-gnueabi-gcc
[sudo] password for faund:
sudo: unable to execute ./arm-none-linux-gnueabi-gcc: No such file or directory
原因应该是官方光盘使用的 Fedora 15 现在已经老旧,它使用的 Linux 内核 2.6.38 版本与我使用的 Linux mint 21.2 的 5.15.0 版本已经相差太远,其二进制可执行文件是不兼容的。
其实发行版中包含了 arm 的交叉编译器,使用下面的命令可以直接安装:
sudo apt install gcc-arm-linux-gnueabi
安装完成之后,用 arm-linux-gnueabi-gcc -v 命令可输出如下所列内容的话,说明交叉编译器已经安装完成了。
faund@faund-Virtual-Machine:~$ arm-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/11/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.3.0-1ubuntu1~22.04.1' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --enable-libphobos-checking=release --without-target-system-zlib --enable-multiarch --disable-sjlj-exceptions --with-specs='%{mfloat-abi=hard:-march=armv7-a -mcpu=generic-armv7-a -mfloat-abi=hard}' --with-arch=armv5t --with-float=soft --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04.1)
2. 进行交叉编译
所谓交叉编译,就是在我们当前运行的 x86 架构电脑上的 Linux 中,为 arm 芯片编译二进制目标代码,这个目标代码包含了 arm 指令集的汇编代码。
按照官方DVD A的“/裸机程序/Linux平台下裸机程序开发指南”目录内《Linux平台下Tiny6410裸机程序开发指南.pdf》文件中第三节的说明对 1.led_s 例子进行交叉编译,由于使用了不同版本的交叉编译器,需要修改 Makefile ,使用新的交叉编译器中对应的命令。修改后的 Makefile 文件如下:
led.bin: start.oarm-linux-gnueabi-ld -Ttext 0x50000000 -o led.elf $^arm-linux-gnueabi-objcopy -O binary led.elf led.binarm-linux-gnueabi-objdump -D led.elf > led_elf.dis
%.o : %.Sarm-linux-gnueabi-gcc -o $@ $< -c%.o : %.carm-linux-gnueabi-gcc -o $@ $< -c clean:rm *.o *.elf *.bin *.dis -rf
然后运行 make 命令,输出结果如下:
faund@faund-Virtual-Machine:~/embeddedDev/bareDev/code/1.leds_s$ make
arm-linux-gnueabi-gcc -o start.o start.S -c
arm-linux-gnueabi-ld -Ttext 0x50000000 -o led.elf start.o
arm-linux-gnueabi-objcopy -O binary led.elf led.bin
arm-linux-gnueabi-objdump -D led.elf > led_elf.dis
很顺利的,得到了我们需要的裸机程序 led.bin

3. 烧写裸机程序到开发板上
《Linux平台下Tiny6410裸机程序开发指南.pdf》文件中第三节中已经说明有 2 种方式将 bin 文件烧写到开发板上,这里采用它推荐的直接下载到 DRAM 的方式。需要 2 个步骤: 1) 准备一个带有 USB 下载功能 Superboot 的 SD 卡,2) 将 bin 文件下载到 DRAM 中并运行。
3.1 制作带有 USB 下载功能的 Superboot SD卡
根据 DVD A 上的文档 《03- Tiny6410刷机指南.pdf》中的说明先把 Superboot-6410.bin 文件用 SD-Flasher.exe 程序烧写到 SD 卡中,所有程序和文件都在光盘中,注意,有的光盘镜像中 Superboot-6410.bin 文件是有问题的。
我在烧写完成之后遇到了问题,从 SD 卡启动时,只显示 “Booting from SD”,等了10多分钟也没有后续输出,后来发现是光盘上的 Superboot-6410.bin 文件是有问题的,在友善之家的论坛中找到了一个文件,重新烧写后才能正常进入 Superboot。
如果遇到和我一样的问题,可以到下面这个链接去下载。
tiny6410从sd卡启动,总是Booting from SD| Linux技术交流区 - 友善之家 嵌入式开发板技术交流社区[size=2]如题,按照步骤来的,想从sd卡上按照bios, ..
http://www.aiothome.net/read.php?tid-86547.html
做完上面步骤之后,参照《03- Tiny6410刷机指南.pdf》中 2.1.2 节说明,将光盘中的 images/FriendlyARM.ini 文件拷贝到 SD 卡中的 images 目录下,并且编辑 ini 文件,添加 USB-Mode = yes 项,我在接下来使用的文件内容如下:
#This line cannot be removed. by FriendlyARM(www.arm9.net)USB-Mode = yes
LCD-Type = H43CheckOneButton=No
Action=Null
OS= LinuxVerifyNandWrite=NoStatusType = Beeper| LED#################### Linux #####################
Linux-BootLoader = Superboot-6410.bin
Linux-Kernel = Linux/zImage
Linux-CommandLine = root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200
Linux-RootFs-InstallImage = Linux/rootfs_qtopia_qt4.img
Linux-RootFs-RunImage = Linux/rootfs_qtopia_qt4.ext3################### Android ####################
Android-BootLoader = Superboot-6410.bin
Android-Kernel = Android/azImage
Android-CommandLine = root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 androidboot.console=s3c2410_serial0
Android-RootFs-InstallImage = Android/rootfs_android.img
Android-RootFs-RunImage = Android/rootfs_android.ext3################### WindowsCE6 #################
WindowsCE6-Bootloader= Superboot-6410.bin
WindowsCE6-BootLogo = WindowsCE6\bootlogo.bmp
WindowsCE6-InstallImage = WindowsCE6\NK-i.bin
WindowsCE6-RunImage = WindowsCE6\NK-i.bin#################### Ubuntu #####################
Ubuntu-BootLoader = Superboot-6410.bin
Ubuntu-Kernel = Ubuntu/uzImage
Ubuntu-CommandLine = root=ubi0:FriendlyARM-root ubi.mtd=2 rootfstype=ubifs init=/linuxrc console=ttySAC0,115200
Ubuntu-RootFs-InstallImage = Ubuntu/rootfs_ubuntu-slc.ubi
Ubuntu-RootFs-RunImage = Ubuntu/rootfs_ubuntu.ext3############### UserBin #################
UserBin-Image=WindowsCE/NK-i.nb0
userBin-StartAddress=50100000
弄好的 SD 卡插到开发板上,启动模式开关拨到 SD-BOOT 位置。开发板和电脑的串口线、USB线都连接好然后开机,Superboot 正常启动的情况下 LED1 会闪烁,如果开发板有屏幕,会有如下显示:

串口控制台输出的内容如下:

3.2 把 led.bin 写入开发板的 DRAM 并运行
由于“年久失修”,官方 DVD 文档中提到的使用友善之臂提供的 MiniTools 应用进行烧写的办法似乎已经没办法用了。在windows下即使安装了 MiniTools 的驱动,也会一直是“Board is not connected”状态无法使用;Linux下因为需要 QT4 的支持,而目前的发行版普遍支持 QT5 以上版本了,我就没有照这个继续折腾了。还是回到官方的 DNW 软件来做本次体验,所以后面的做法并没有按照官方 DVD 的文档进行。
在开发板正常引导了 superboot 之后,因为已经用 USB 连接了电脑,所以电脑上出现了一个新的设备,但是在 windows 10 下,这个设备的驱动程序并没有自动安装好:

原因是老旧的驱动没有签名,参考下面链接:
关于win10装不上dnw驱动的问题_新版dnw驱动解决win不兼容_陆少ye的博客-CSDN博客
【dnw驱动数字签名】解决Win10安装USB驱动时,"INF不包含数字签名信息"_aoxiang_ywj的博客-CSDN博客
先要按照下面步骤关闭 windows 10 的强制验证驱动签名
1. “开始”菜单 ->“设置”->“更新和安全”->“恢复”里的“立即重启”;
2. 电脑这时候会重启,进入一个设置界面,等待出现新界面;
3. 新界面中选取“疑难解答”->“高级选项”->“启动设置”里点击“重启”;
4. 机器重启后就有一些选项了,第七个就是禁止验证驱动签名,按下数字键“7”就可以了,关闭驱动签名完成;
电脑启动后,到下面的地址下载 DNW 驱动程序:
win7-64位-DNW-USB驱动-FriendlyArm tiny6410 已签名| Linux技术交流区 - 友善之家 嵌入式开发板技术交流社区[b][color=#ff0000][size=5][i] 折腾了几天,终于把 ..
http://www.aiothome.net/read.php?tid-80424.html更新之前带有感叹号的 SEC S3C6400X Test B/D 设备驱动:

选取浏览我的电脑以查找驱动程序:


找到刚才下载的 DNW 驱动程序,inf 文件在 secbulk64.zip 包内的 secbulk64\inf64 目录中

选好了 secbulk.inf 文件之后,会出现下面显示,其中显示了 S3C2440 字样,不用管它,应该是通用的驱动,或者是社区驱动作者的笔误,直接点击下一步;

在下面的安全警告窗口中点击“始终安装以驱动程序软件”,因为已经关闭了强制验证驱动签名,才有这个机会来安装没有签名的驱动程序,不然会直接告知驱动程序安装失败;
安装结束之后,驱动程序就出现在下图这个位置:

到下面这个链接下载 DNW 软件:
DNW软件改进,添加了快捷按键,增强了界面显示等| 相关资料下载及使用技巧 - 友善之家 嵌入式开发板技术交流社区DNW软件改进,添加了快捷按键,增强了界面显示等
http://www.aiothome.net/read.php?tid-3531.html运行这个 DNW 软件,注意到已经有显示“USB:OK”,说明已经与开发板 Superboot 正常连接了;

在开发板的串口控制台中按 d 键,即命令开发板 “Download and Run an Absolute User Application”,下载并运行裸程序。

此时串口控制台显示正在等待 DNW 传输数据,在 DNW 软件上按 F7,然后选择之前交叉编译好的 led.bin 文件之后,DNW会显示数据传输用时,串口控制台会显示 “Download Done.” 等信息。

串口控制台显示“Run Absolute User Application...”,现在开发板已经在运行我们的裸机程序了,可以观察到开发板上 LED1 到 LED4 这 4 个 LED 灯一起在闪烁了,效果可以看下面的视频:
友善之臂运行裸程序示例 led.bin
4. 结论
友善之臂的 Tiny6410 开发板虽然已经老旧了,官方很多支持也已经“年久失修”,但是在目前还是可以正常进行嵌入式的开发体验的,走通了裸机程序的各个环节之后,可以先进行裸机程序的深入研究,然后再慢慢可以去体验各种操作系统的嵌入式编程。
相关文章:
在linux中进行arm交叉编译体验tiny6410裸机程序开发流程
在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。 1. 交叉编译器安装 按照光盘A中的文档《04- Tiny6410 L…...
SpringBoot实战(二十三)集成 SkyWalking
目录 一、简介二、拉取镜像并部署1.拉取镜像2.运行skywalking-oap容器3.运行skywalking-ui容器4.访问页面 三、下载解压 agent1.下载2.解压 四、创建 skywalking-demo 项目1.Maven依赖2.application.yml3.DemoController.java 五、构建启动脚本1.startup.bat2.执行启动脚本3.发…...
深度学习实践——卷积神经网络实践:裂缝识别
深度学习实践——卷积神经网络实践:裂缝识别 系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践ÿ…...
linux | vscode | makefile | c++编译和调试
简单介绍环境: vscode 、centos、 gcc、g、makefile 简单来说就是,写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程,以及官网也看了很多次,最…...
Spring | Bean 作用域和生命周期
一、通过一个案例来看 Bean 作用域的问题 Spring 是用来读取和存储 Bean,因此在 Spring 中 Bean 是最核心的操作资源,所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的…...
培训(c++题解)
题目描述 某培训机构的学员有如下信息: 姓名(字符串)年龄(周岁,整数)去年 NOIP 成绩(整数,且保证是 5 的倍数) 经过为期一年的培训,所有同学的成绩都有所提…...
ansible-playbook编写 lnmp 剧本
ansible-playbook编写 lnmp 剧本 vim /opt/lnmp/lnmp.yaml执行剧本 ansible-playbook lnmp.yaml...
需求太多处理不过来?MoSCoW模型帮你
一、MoSCoW模型是什么 MoSCoW模型 是在项目管理、软件开发中使用的一种排序优先级的方法,以便开发人员、产品经理、客户对每个需求交付的重要性达成共识。 MoSCoW是一个首字母缩略词,代表: M(Must have):…...
Vue 3:玩一下web前端技术(六)
前言 本章内容为VUE请求后端技术与相关技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(五)_Lion King的博客-CSDN博客 下一篇文章地址: Vue 3:玩一下web前端技术(七)_Lio…...
【点云处理教程】00计算机视觉的Open3D简介
一、说明 Open3D 是一个开源库,使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式,例如 .ply、.obj、.stl 和 .xyz,并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…...
Windows10系统还原操作
哈喽,大家好,我是雷工! 复制了下虚拟机的Win10系统,但其中有一些软件,想实现类似手机的格式化出厂操作,下面记录Windows10系统的还原操作。 一、系统环境: 虚拟机内的Windows10,64…...
Django学习笔记-模板(Template)基础
使用模块可以很方便的执行一些数据操作,然后根据传入的数据直接在模板html文件中进行处理。 1.Django中的模板配置 Django的模板引擎在sttings.py文件中: TEMPLATES [{# 模板引擎,默认为django模板BACKEND: django.template.backends.dja…...
使用 NVM(Node Version Manager)管理 Node.js 版本
使用 NVM(Node Version Manager)管理 Node.js 版本 步骤一:安装 NVM NVM 是一个用于安装和管理不同版本的 Node.js 的工具。首先,你需要确保你的系统上已经安装了 NVM。可以通过以下命令检查 NVM 是否已经安装: nvm …...
(文章复现)梯级水光互补系统最大化可消纳电量期望短期优化调度模型matlab代码
参考文献: [1]罗彬,陈永灿,刘昭伟等.梯级水光互补系统最大化可消纳电量期望短期优化调度模型[J].电力系统自动化,2023,47(10):66-75. 1.基本原理 1.1 目标函数 考虑光伏出力的不确定性,以梯级水光互补系统的可消纳电量期望最大为目标,函数…...
tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 -量勺
tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 - 测量长度 Project Overview: 项目概况: A machine shop, where any idea can become a reality, can cost millions and million of dollars. Still, the most important tool in the shop is the…...
linux系统编程重点复习--线程同步
目录 复习目标: 1 互斥锁 1.1互斥锁的使用步骤 1.2 练习 1.3 死锁 2 读写锁 3 条件变量 4 信号量 复习目标: 熟练掌握互斥量的使用说出什么叫死锁以及解决方案熟练掌握读写锁的使用熟练掌握条件变量的使用理解条件变量实现的生产消费者模型理解…...
【Docker 学习笔记】Windows Docker Desktop 安装
文章目录 一、前言二、Windows Docker 安装1. 基于Hyper-V后端和Windows容器的安装2. 基于WSL2后端的安装(推荐)3. 安装Docker Desktop on Windows4. 启动并验证Docker Desktop 一、前言 Docker并非是一个通用的容器工具,它依赖于已存在并运…...
getInputStream has already been called for this request 问题记录
问题背景 HttpServletRequest.getReader() HttpServletRequest.getInputStream() 不能在过滤器中读取一次二进制流(字符流),又在另外一个Servlet中读取一次,即一个InputSteam(BufferedReader)对象在被读取完成后,将无…...
日撸代码300行:第60天(小结)
1、自己对于这个专栏的代码抄写也是断断续续,由于种种原因上次在第54天没坚持下来,这次继续希望能抄完。 2、现在代码的阅读和理解能力明显比刚开始抄代码的时候强了不少。感觉坚持到现在收获还是不小。现在基本上来说仔细想一下都能够理清楚代码的意思。…...
python和java哪个更有前景,python和java哪个更有前途
大家好,小编为大家解答python和java哪个好学,零基础的问题。很多人还不知道python和java哪个更容易入门,现在让我们一起来看看吧! 进入编程行业是很多人的梦想,现在越来越多的人都想要通过培训的方式进入IT行业中,但是…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

