简介:
FreeRTOS-Kernel V10.5.1 | gcc version 6.5.0 (crosstool-NG 1.24.0) 在官方已有的ARM7_LPC2000的移植模板文件基础上修改(FreeRTOS-Kernel/portable/GCC/ARM7_LPC2000)使用heap4。
移植调度器:
初始化一个定时器用于提供系统心跳时钟。选择初始化定时器4的周期为1ms,配置为fiq。在prvSetupTimerInterrupt()中调用初始化函数如下图:
在vPortISRStartFirstTask()中添加汇编函数如下:目的是在启动第一个函数前切换处理器到特殊模式,简而言之就是要切换到非系统或用户模式,因为这里portRESTORE_CONTEXT()的实现中修改了r14寄存器,如果执行时处于系统或用户模式恢复函数上下文的时候就会跑飞。因为我将定时器4设置为fiq,所以这里我选择了快中断模式。
最后将vTickISR( void )和vPortYieldProcessor( void )分别注册为fiq和swi的中断服务函数,移植就基本完成了。
解决中断嵌套:
因为fiq可以打断irq和swi的执行,然而我的裸机中断服务函数并没有实现中断嵌套的功能,所以如果在irq或swi中断服务函数执行的过程中发生fiq中断切换函数的时候就会跑飞,如上图所示,目前的解决办法是在fiq中断服务函数中添加代码判断进入中断前处理器的状态,即检查spsr_fiq中保存的值,如果不是系统模式就只调用xTaskIncrementTick()函数,保持RTOS心跳tick的准确,在非中断嵌套的场景再执行任务切换。
改进:
在fiq中判断中断是否嵌套后可以设置一个标志位在r8~r12中,在fiq退出前切换处理器状态检测这个标志位并执行任务切换,达到类似pendSV的效果。(swi中断本身就是为了切换任务所以不需要再调度一次)
相关文章









