上面提到, 创建系统所需任务和初始化相关静态变量后, 系统调用了 xPortStartScheduler设置节拍定时器和启动第一个任务,开始系统正常运行调度。 而对于不同架构平台,该函数的实现可能存在不同,以下, 拿比较常用的 Cotex-M3 架构举例。
对于 M3, 可以在源码目录下 看到该函数的实现。freertos 任务
与 FreeRTOS 任务优先级相反, Cotex-M3 优先级值越小, 优先级越高。 Cotex-M3的优先级配置寄存器考虑器件移植而向高位对齐,实际可用的 CPU 会裁掉表达优先级低端的有效位,以减少优先级数。 举例子说, 加入平台支持3bit 表示优先级,则其优先级配置寄存器的高三位可以编程写入,其他位被屏蔽,不管写入何值,重新读回都是0。
另外提供抢占优先级和子优先级分段配置相关,详细阅读 《Cortex-M3权威指南》
在系统调度过程中,主要涉及到的三个异常:
SVC 系统服务调用
操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数。 这里主要触发后,在异常服务中启动第一个任务
PendSV 可悬起系统调用
相比 SVC, PenndSV 异常后可能不会马上响应, 等到其他高优先级中断处理后才响应。 用于上下文切换,同时保证其他中断可以被及时响应处理。
SysTick 节拍定时器
在没有高优先级任务强制下,同优先级任务按时间片轮流执行,每次SysTick中断,下一个任务将获得一个时间片。freertos 任务
BaseType_t xPortStartScheduler( void )
{
configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );
#if( configASSERT_DEFINED == 1 )
{
volatile uint32_t ulOriginalPriority;
// 取出中断优先级寄存器
volatile uint8_t * const pucFirstUserPriorityRegister =
(volatile uint8_t * const) (portNVIC_IP_REGISTERS_OFFSET_16 +
portFIRST_USER_INTERRUPT_NUMBER);
volatile uint8_t ucMaxPriorityValue;
// 保存原有优先级寄存器值
ulOriginalPriority = *pucFirstUserPriorityRegister;
// 判断平台支持优先级位数
// 先全写 1
*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
// 重新读回, 不能设置的位依然是 0
ucMaxPriorityValue = *pucFirstUserPriorityRegister;
// 确保用户设置优先级不会超出范围
ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;
// 判断有几个1, 得到对应优先级数最大值
ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
{
ulMaxPRIGROUPValue--;
ucMaxPriorityValue <<= ( uint8_t ) 0x01;
}
ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
// 恢复优先级配置寄存器值
*pucFirstUserPriorityRegister = ulOriginalPriority;
}
#endif /* conifgASSERT_DEFINED */
// 设置 PendSV 和 SysTIck 异常优先级最低
// 保证系统会话切换不会阻塞系统其他中断的响应
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
// 初始化系统节拍定时器
vPortSetupTimerInterrupt();
// 初始化边界嵌套计数器
uxCriticalNesting = 0;
// 触发 svc 异常 启动第一个任务
prvPortStartFirstTask();
/* Should not get here! */
prvTaskExitError();
return 0;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33581-2.html
就是和韩国都没得比
中国遵守国际法则