前言
我所使用的是正点原子的IMX6ULL的mini板,在经过b站的课程学习之后,将我自己所理解的一些东西记录下来,以备后续查询使用
初学嵌入式,类比stm32,突然发现keil这个IDE的强大,目前我的嵌入式的开发学习没有用到这种可以让学习者忽略底层,直接编写应用逻辑的IDE。
嵌入式的开发需要先通过汇编语言“告诉”你的核心板:“把c语言的编译环境先准备好。”然后告诉它你接下来告诉你要运行的代码头在哪里,然后让他沿着你给他的起点跑你给他编写的C语言程序。而这些操作,从前的keil已经帮我们把这些东西告诉过单片机了,嵌入式开发得让我们自己去编写汇编代码。
点亮一盏LED灯
1.编写.S文件
在嵌入式开发中,点亮一盏LED灯你需要准备以下几个东西:Ubuntu虚拟机,交叉编译器。你需要在虚拟机中建立工程,首先就是一个LED.s文件,这个文件就是汇编程序,根据上文可知,你需要通过汇编去让核心板准备好C语言的环境
.global _start /* 全局标号 */
_start:
/* 进入SVC模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0, r0, #0x13 /* r0或上0x13,表示使用SVC模式 */
msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */
ldr sp, =0X80200000 /* 设置栈指针 */
b main /* 跳转到main函数 */
代码就是告诉芯片,准备好C语言环境,然后再把这个起点给你定好,让你顺着这个C的程序跑。
2.编写C语言逻辑代码
这个实验里面的,嵌入式的C语言开发大部分都是对寄存器进行操作,所以。。我觉得代码没必要放上来,建议搭配视频课程食用效果更佳。
3.编译下载
我们在工程中编写完一系列的.C .H .S 文件以后呢就需要去使用我们的一个交叉编译器将这些文件集成,编译,打包成一个我们开发板能认出来的文件.
首先需要将.S .C等文件都通过交叉编译器转换为可执行的.o文件
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
然后将这些.o文件链接成一个.elf文件,在链接的时候需要将先将这些文件链接到一个开发板运行的起始地址位也就是0X8780 0000
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
最后将.elf文件再转化为可执行.bin文件
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
4.烧写
正点原子专门编写了一个软件来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做“imxdownload”
读卡器挂载到Ubuntu虚拟机中以后
./imxdownload <.bin file> <SD Card>
拔出读卡器,插到板子上,拨码拨对,上电灯亮,至此完成嵌入式点灯成就。
彻底整明白,花费时长2天
总结
接触嵌入式以后,发现嵌入式的难度很高,因为这个东西貌似跟我之前学的stm32差别不大但是又感觉这个东西所涉及到的底层更多,虽然我最一开始学的标准库,对底层的东西接触了那么一点,但是学完这个之后,发现此前学的那些底层知识完全不足。
在跟着教程翻数据手册时,完全看不下去,根本看不懂,虽然很崩溃,但是道阻且长,慢慢加油。
最后附上B站链接,望诸君共勉。