C C++最新纯C语言实现bootloader_bootloader c源码,C C++开发者出路在哪

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

之前有用很少一部分汇编实现过bootloader,但经过后来慢慢改进,发现是可以用纯C语言实现嵌入式操作系统的引导。

下面是之前对不能完全使用C语言引导系统的几点说明:

1、C程序中所有的代码都是以函数的形式出现,而函数定义通常会用到参数和在函数里面定义一堆局部变量,而这些变量一旦过多时,寄存器就无法全部保存,此时就会将剩下的变量存到堆栈里面,即,SP寄存器所指向的内存里面,而此时的SP寄存器并未赋初值,也就没有确切的内存地址可用。所以需要用到堆栈的前提是SP堆栈指针已经有了明确指向,否则就是非法访问内存,那么SP的设置又离不开汇编。

2、一般bootloader都会分成多阶段完成,而第一阶段的运行内存空间和第二阶段的内存运行空间往往相差很远,所以如果要从第一阶段跳转到第二阶段,那么就是必要用绝对转移,也就是给PC寄存器直接赋值的那种方式,而C语言中用的是函数调用,而函数调用全部都是相对跳转,也就是相对于当前PC地址跳到另一个偏移地址。这里并不是说相对跳转的距离不够,而是地址空间分配有问题。一般第一阶段代码都是与地址不相关的,而所有的两阶段程序都被链接到统一地址空间,所谓统一就是一二阶段不能分家,但不分家不可能,如果都不分家,那就不叫两阶段或多阶段了,就直接是单阶段启动。那么要给PC寄存器赋值,也是离不开汇编的。

3、当然还有,在运行bootloader第二阶段代码之前要用到动态内存,它不像静态内存可以直接使用,动态内存是一种廉价的RAM,是需要先初始化后才能使用的,这就必然导致在运行真正的应用程序之前有一段程序会在静态内存中先执行。不过对动态内存的初如化是很容易使用C语言实现的,无需堆栈的支持。

所以根据以上三点分析,发现重点就是前两条,也就是怎样在C语言中实现对寄存器的访问,我之前做的bootloader虽然没有用到汇编文件,但使用了内嵌汇编来做,感觉还是有汇编存在,对于不懂汇编的人看起来还是不够爽快。后来想到了定义寄存器变量,所以就这么干了,这次使用了两个寄存器变量(分别是R13和R15)实现了纯C语言的bootloader。第一阶段代码可以参考如下:

register volatile unsigned int init_sp asm ("r13");
register volatile unsigned int jmp_pc asm ("r15");
void _start(void)
{
 //asm volatile("ldr sp, =0x33de8000\n");//STACK_BASE+STACK_SIZE-4=0x33de8000
 
 init_sp = STACK_BASE+STACK_SIZE-4;
 disable_watch_dog();


![img](https://img-blog.csdnimg.cn/img_convert/4522066cbc54ed9e7e5fd46aa7c1d14b.png)
![img](https://img-blog.csdnimg.cn/img_convert/3b24e1efeb4e4b7779a2e93cd337482b.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值