内核移植
CPU架构移植
移植分成CPU架构移植和BSP(Board Support Package,板级支持包)两部分。
- 实现cpulib抽象:
主要文件:cpuport.c context_rvds.S
主要接口:
1 | /************** context_rvds.S 实现 ***************/ |
在中断服务函数中进程线程切换需要等到中断结束后才能进行切换,在线程中进行线程切换是马上进行切换。
在中断程序处理完事务之后,中断退出之前,检查 rt_thread_switch_interrupt_flag 变量(调用 rt_hw_context_switch_interrupt 函数时会标记该变量和设置from、to线程等待中断处理完成进行线性切换)如果为1,就根据 rt_interrupt_from_thread, rt_interrupt_to_thread 变量,进程一次上下文切换。
向上对内核提供一套统一的函数接口,包括全局中断开关函数、线程栈的初始化函数、上下文切换函数、时钟节拍配置和中断函数。
- 线程栈的初始化

僵尸线程:已经被系统删除,线程不属于任何ipc量,对调度器不可见但是它的资源还未被释放的线程叫僵尸线程。
僵尸线程链表:rt_thread_defunct。
- 线程栈图示
在线程创建时通过 rt_hw_stack_init 函数手动构建一个上下文内容,作为每个线程第一次执行的初始值 ,如下图:


Cortex-M处理器在线程上下文切换过程中,pendsv发生后,r0-psr 由硬件自动压栈/出栈,r4-r11需程序手动压栈/出栈(由 rt_hw_context_switch 函数完成)。
- PSR特殊功能寄存器组包括:

特殊功能寄存器是按位来表示的。

- 实现时钟节拍
开启一个定时器中断,可以是systick也可以是rtc,但需要保证这个定时器无论什么时候都在运行就算设备休眠进入低功耗。
1 | void SysTick_Handler(void) |
BSP移植
板卡移植:CPU架构移植已经实现CPU芯片相关的移植,但还需要使RAM、GPIO、UART等外设工作才能建立操作系统运行的基本环境。
传统意义上的嵌入式计算机CPU和RAM是毫无关系的,不同的CPU可以配不同的RAM,只是MCU把CPU和RAM集成在了一个芯片,所以CPU架构移植不包括RAM的部分。
主要工作:
1.初始化CPU内部寄存器,设定RAM工作时序。
2.实现时钟驱动及中断控制器驱动,完善中断管理。
3.实现串口和GPIO驱动。
4.初始化动态内存堆,实现动态内存堆管理。
- 建立rtthread工程
1.拷贝rt-thread文件夹到工程文件夹,添加内核源码、cpulib层、board.c相关文件到工程,添加相关头文件目录。
- 实现时钟管理
1.在boar.c初始化滴答定时器配置中断,在中断函数中添加rt_rt_tick_increase();
- 实现控制台
1.初始化串口。
2.实现rt_hw_console_output()函数。
- 实现动态内存管理
1.在rt_hw_board_init()函数调用rt_system_heap_init()初始化系统堆内存。
最后运行结果:
本章小结:
1.CPU架构移植主要要移植cpulib层包括:cpuport.c context_rvds.S,全局中断相关、上下文相关的API以及时钟节拍的实现。
2.BSP移植主要需实现:实时时钟管理,动态堆内存管理,控制台输出。