前言:
前段时间有过linux的初级学习经历,了解到它的启动过程,大概分为初始化、运行init进程、挂载根文件系统、脚本解析、创建任务等。Nuttx也大同小异,现梳理一下其启动流程,有助于对整个系统的掌握。
看源码之前的思考:
由于nuttx由driver、net、fs、schedule、mm和一些app构成,并在系统启动之后可以进行命令交互,那么在启动过程中就需要先去初始化显示终端console、driver、net所需的硬件环境、第一个进程、app的运行条件等。nuttx的启动应该是按照这个大方向去实现一系列动作的,具体的过程当然需要阅读源码。
1. void __start(void)
首先是执行__start函数,完成一系列初始化和配置,然后跳转至os_start()。
1.1清bss段
首先需要知道为什么要清除bss段以及什么是bss段?
在编译时可通过链接脚本(nuttx/configs/xxxxx/scripts/flash.ld)中分类的段以及段地址来进行代码分类,同时指定程序的运行地址(注意与装载地址区分开来),一般来说可分为text、data、bss。bss段为程序中未初始化的全局变量和静态变量。
在链接阶段,将不同模块中的同一类段进行重装排序(按照链接脚本约定的顺序)。至于段基地址,则根据不同的目标板来设定,本次使用的是stm32f767,查看手册可知道其flash和sram的大小以及地址。Flash为2048k,基地址为0x08000000;sram为512k,基地址为0x20000000。
在程序运行初期,由于bss段里的数据未初始化,所以需要统一的给bss段中的数据清零,这也是代码分类的好处之一,统一处理统一类型的数据。
1.2从flash中将data段移动到sram中指定的位置
为什么要将data段数据移动到sram中?
作为只读的rom性质的flash,是不允许对存在的数据进行写操作的,而在程序中的全局数据data段,是需要进行读写操作的,那就