首页 > 系统相关 >LINUX-裸板程序的开发

LINUX-裸板程序的开发

时间:2024-09-16 14:56:18浏览次数:3  
标签:led 程序 裸板 0x48000000 LINUX a9 main arm cortex

昨天和大家分享了一些裸板程序开发的流程,今天小伙伴可以根据我写的内容简单的写一下,你人生的第一个裸板程序(其中有一些具体的源代码以个人爱好进行写,有小伙伴需要的可以私信)

1.上位机linux系统编辑LED裸板程序代码,具体实施步骤如下:
sudo chown tarena /opt  -R //将/opt目录的root用户权限修改为tarena用户
sudo chgrp tarena /opt -R  //将/opt目录的root组权限修改为tarena组
结果是tarena普通用户也可以访问/opt目录了,后面嵌入式的代码都放在/opt目录中

mkdir -p /opt/arm/day01/1.0 
cd /opt/arm/day01/1.0
vim led.h  //各种声明
vim led.c  //各种定义
vim main.c //负责调用
        
2.上位机安装交叉编译器(针对于ARM架构的gcc)
获取交叉编译器:porting_resource.rar/交叉编译器/arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz
cp arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz /opt/
cd /opt/
tar -xvf arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz
mv arm-cortex_a9-eabi-4.7-eglibc-2.18  toolchains //对生成的目录重命名为toolchains
sudo vim /etc/environment 
打开此文件在PATH环境变量中添加:/opt/toolchains/bin
结果如下:PATH="/opt/toolchains/bin:........" //注意:.......是省略了,你们千万别省略----设置PATH环境变量是为了让系统知道在哪里可以找到可执行文件,从而在命令行中可以直接使用命令名来执行这些文件,而不需要指定完整路径。不用写  ------./
保存退出
重启上位机linux系统
验证交叉编译器是否生效,执行以下命令:
arm-cortex_a9-linux-gnueabi-gcc -v //查看交叉编译器的版本,如果能够看到说明安装成功

3.上位机交叉编译LED裸板程序,具体实施步骤如下:
cd /opt/arm/day01/1.0
arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c 
arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o main.o main.c 
说明:
arm...gcc:C语言程序的交叉编译器
-nostdlib:告诉编译器一律不允许使用标准C库,此程序乃裸板程序
-c:只编译不链接

arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib -Ttext=0x48000000 -emain -o led.elf  main.o led.o
说明:
arm...ld:链接器,将所有的.o文件组合在一起
-nostartfiles:告诉链接器,由于是裸板程序,无需添加相关的启动代码(就是程序的真正入口_start->main)
-Ttext=0x48000000:指定程序代码段的起始地址为0x48000000
-emain:指定程序的入口函数为main
-o led.elf:生成elf格式的可执行文件
    注意:elf格式的可执行文件只能运行在操作系统下,此文件的格式:文件信息头+纯正的二进制代码+文件信息尾
    在操作系统下,操作系统会帮你提取纯正的二进制代码最终运行

arm-cortex_a9-linux-gnueabi-objcopy -O binary led.elf led.bin
说明:
arm...objcopy:二进制文件处理功能,提取纯正的二进制代码
           类似去皮的工具,led.elf:类似带皮的核桃,led.bin:类似核桃里面的果肉,不带皮
led.elf:带皮的核桃,操作系统会去皮,也可以手动利用arm...objcopy去皮
led.bin:果肉,不带皮,是真正要运行的代码文件

cp /opt/arm/day01/1.0/led.bin /tftpboot  //拷贝led.bin到tftp网络下载服务的共享目录中

4.下位机测试
重启下位机,进入uboot命令行模式执行:
print  //查看serverip和ipaddr环境变量对应的地址是否正确
ping 192.168.1.8
tftp 0x48000000 led.bin 
go 0x48000000 


5.掌握反汇编工具(objdump),具体实验步骤如下:
a)上位机执行:
    cd /opt/arm/day01/1.0
    arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c //只编译不链接,不允许用标准C库的代码
    arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o main.o main.c 
    arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib -Ttext=0x48000000 -emain -o led.elf main.o led.o //链接
    arm-cortex_a9-linux-gnueabi-objcopy -O binary led.elf led.bin //提取纯正的二进制代码
    arm-cortex_a9-linux-gnueabi-objdump -D led.elf > led.dis 
    说明:
    arm...objdump:反汇编工具,将二进制可执行文件翻译生成汇编文件
        gcc正向编译:.c->.i->.s->.o->可执行程序
        反汇编/逆向编译:可执行文件或者.o->.s
    led.dis:就是生成的反汇编文件,里面就是汇编代码
    vim led.dis //打开反汇编文件,得到:
     led.elf:     文件格式 elf32-littlearm //ELF格式,32位,小端模式,arm模式    ,后续详解
     Disassembly of section .text: //以下就是代码段的内容
    48000000 <main>: //说明main函数的内存起始地址就是0x48000000
                //也就是说内存的0x48000000这个地址存放的是main函数
               将来在下位机执行go 0x48000000时,实际是让cpu直接运行main函数
               至于其他的信息后续课程详解!
               
b)下位机测试:
重启下位机,进入uboot命令行模式执行:
print  //查看serverip和ipaddr环境变量对应的地址是否正确
ping 192.168.1.8 //先验证网络是否联通
tftp 0x48000000  led.bin //下载内容到下位机内存0x48000000
go 0x48000000   ->运行0x48000000地址上的程序(led.bin)

6.案例:继续玩转反汇编工具
a)上位机实施步骤:
cp /opt/arm/day01/1.0 /opt/arm/day01/2.0 -fr
cd /opt/arm/day01/2.0
vim led.c 
将delay函数或者led_init,除了入口函数main其余的任意函数定义的代码放到入口函数main的前面
保存退出
arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c //只编译不链接,不允许用标准C库的代码
arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o main.o main.c 
arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib -Ttext=0x48000000 -emain -o led.elf main.o led.o//链接
arm-cortex_a9-linux-gnueabi-objcopy -O binary led.elf led.bin //提取纯正的二进制代码
拷贝到windows的fastboot目录中
arm-cortex_a9-linux-gnueabi-objdump -D led.elf > led.dis 
vim led.dis 得到:
48000000 <led_init>: //此时下位机内存的0x48000000地址放的不再是入口函数main,而出第一个函数led_init
            将来在下位机执行go 0x48000000肯定无法再循环开关灯了,因为cpu执行led_init
            并不会执行main函数
b)下位机测试:
重启下位机,进入uboot命令行模式执行:
print  //查看serverip和ipaddr环境变量对应的地址是否正确
ping 192.168.1.8 //先验证网络是否联通
tftp 0x48000000  led.bin //下载内容到下位机内存0x48000000
go 0x48000000   ->运行0x48000000地址上的程序(led.bin)//实际是让cpu直接去执行led_init函数,无法再开关灯了    

c)上位机实施步骤:
cp /opt/arm/day01/1.0 /opt/arm/day01/3.0 -fr
arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c //只编译不链接,不允许用标准C库的代码
arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o main.o main.c 
arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib -Ttext=0x48000000 -emain -o led.elf led.o main.o //链接
arm-cortex_a9-linux-gnueabi-objcopy -O binary led.elf led.bin //提取纯正的二进制代码
拷贝到windows的fastboot目录中
arm-cortex_a9-linux-gnueabi-objdump -D led.elf > led.dis 
vim led.dis 得到:
go 0x48000000 <led_init>: //此时下位机内存的0x48000000地址放的不再是入口函数main,而出第一个函数led_init
            将来在下位机执行go 0x48000000肯定无法再循环开关灯了,因为cpu执行led_init
            并不会执行main函数
b)下位机测试:
重启下位机,进入uboot命令行模式执行:
print  //查看serverip和ipaddr环境变量对应的地址是否正确
ping 192.168.1.8 //先验证网络是否联通
tftp 0x48000000  led.bin //下载内容到下位机内存0x48000000
go 0x48000000   ->运行0x48000000地址上的程序(led.bin)//实际是让cpu直接去执行led_init函数,无法再开关灯了
    
c)切记:裸板程序在链接时(arm...ld)是从文件的开头依次向下开始一个函数一个函数的链接
    所以就需要将入口函数放到文件的最开头,如果是多个文件(.o)
    则将入口函数所在的.o文件放到第一个去连接:
    例如:arm...ld .... -o xxx.elf  A.o B.o C.o ... //A.o文件中的第一个函数就是入口函数,所以A.o放到最开头

标签:led,程序,裸板,0x48000000,LINUX,a9,main,arm,cortex
From: https://blog.csdn.net/2302_78937621/article/details/142302643

相关文章

  • Linux 基础入门操作-实验二 makefile使用介绍 和 实验三 hello 输出
    1介绍Makefile是linux下的项目管理工具,想象一下当有很多源文件需要编译、链接时,你只需执行make命令即可完成编译操作,这样是不是很方便呢。make命令执行时,需要一个Makefile文件,用来告诉make命令需要怎么样的去编译和链接程序,下面详细介绍Makefile的使用与书写规......
  • 什么叫量化交易系统,程序化交易的未来是什么呢
    Python股票接口实现查询账户,提交订单,自动交易(1)Python股票程序交易接口查账,提交订单,自动交易(2)程序化交易的未来展望可以从多个角度进行分析,包括技术进步、市场适应性、监管环境以及行业趋势等方面。以下是对程序化交易未来可能发展方向的几点分析:技术进步与智能化:随着人......
  • 怎么编写程序化交易系统,股票交易接口API如何申请
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • 【Linux】Linux项目自动化构建工具-make/Makefile
    make/Makefile1.背景2.概念3.实例代码1.背景一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——......
  • 程序员是怎么做到写了 Bug 还理直气壮的?
    “你怎么能如此自信地面对程序中的错误呢?” 测试小姐姐以质疑的口吻向程序员小哥哥提出挑战。事件的导火索是公司的测试小姐姐在评估产品时发现了几个错误。恰巧,编写这个产品的程序员与测试小姐姐关系不错,两人经常互相打趣。当测试小姐姐发现程序员小哥哥的代码存在错误时,她以......
  • Springboot个性化学习推荐网站ua750程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着互联网技术的飞速发展,学习方式正经历着深刻的变革。传统教育模式已难以满足学习者日益增长的个性化需求。个性化学习推荐网......
  • Springboot个人健康管理系统tfg73--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着生活节奏的加快和健康意识的提升,个人健康管理已成为现代人关注的焦点。传统的健康管理方式往往依赖于定期体检和医生指导,缺......
  • Springboot工商闲置单车销售平台2r343(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着城市化进程的加快和单车市场的快速发展,大量商家和个人拥有闲置单车,这些单车不仅占用了宝贵的空间资源,还造成了环境浪费。因......
  • 大专码农和 985 程序员有什么区别?
    看到一个有意思的问题:大专码农和985程序员有什么区别?在IT这一领域,学历和职场之间的关系是复杂而多维的,学历在职场中到底扮演了什么角色,大专学历和985高校学历的程序员在求职过程、职业发展路径以及技能培养方面,究竟存在哪些相似与不同之处?聊聊我的看法。首先比较直观的区别就是,......
  • Linux下通过命名管道实现进程间通信
    引入上一篇文章介绍了Linux中通过pipe创建匿名管道,并实现父子进程间通信的功能;当时我就提到了Linux中的另一种管道通信方式——命名管道,下面就来详细介绍一下;命名管道什么是命名管道命名管道(NamedPipe),也叫FIFO(FirstInFirstOut),是一种用于进程间通信(IPC)的机制。与匿名管......