发布网友 发布时间:2024-09-28 01:49
共1个回答
热心网友 时间:2024-09-28 19:21
代码的组成,全局来看分为数据段和代码段,代码段如何访问并执行,数据如何被指令寻址并读写?PC寄存器描述了代码在存储器上的位置,CPU加载PC指向的代码运行,修改PC值为正确位置即可。数据分为局部数据和全局数据,CPU操作均在寄存器中,寄存器数量有限,操作前需保存值到栈上,操作完成后恢复。栈存储位置通过SP寄存器描述,PC+RA指令位置,SP局部数据栈,Other寄存器记录数据,构成程序正常运转能力。以ARM-R系列芯片为例,全局寄存器组成如下:
如何实现任务切换?系统中有两个任务运行,每个任务有一套R0-R15和CPSR寄存器副本,切换到自己的时,切换器将该任务的寄存器副本设置到R0-R15和CPSR中,CPU到当前PC地址运行。切换顺序如何考虑?先切换PC值,CPU会到PC所在位置运行,可能不知道当前任务正确寄存器值。因此,在正确顺序是最后切换PC,先修改其他寄存器。总结,任务定义一个存储区域存放寄存器,任务切换器实现保持和恢复。
注意,寄存器CPSR设置只能在非USER模式下进行,通常在可以操作CPSR内容模式下进行,FreeRtos选择在SYS模式下进行。
任务切换时机:Linux系统下,任务切换可以为内核主动调用schedule,放弃当前CPU,或在定时器中断中,任务时间片用完触发调用。FreeRtos使用这两种方法。FreeRtos的任务切换在FreeRTOS_IRQ_Handler/FreeRTOS_SWI_Handler中实现,前者是中断中完成,后者在SWI异常中完成。
SWI方式:主动发起方式,选择SYS_MODE统一处理,因为SYSmode下,寄存器和User mode寄存器一样,方便保存和恢复,且权限处于特权模式下,可以设置CPSR寄存器。
定时器中断方式:看时间片的中断处理函数即可。进行任务切换时,都标记xSwitchRequired = pdTRUE。该符号在后续中断处理函数中会检查,发现为True,则进行上下文切换。
选择下一个任务是调度算法要做的事情,FreeRtos使用优先级算法,高优先级优先于低优先级任务,同优先级任务基于时间片轮转。
引用:
[1] freertos.org/fr-content...
[2] arm r serial programmer guide