原创
六、freeRTOS 系统内核控制函数与临界段保护
系统内核控制函数
内核控制函数就是 FreeRTOS 内核所使用的函数,一般情况下应用层程序不使用这些函数。如下所示:
临界段保护
临界段保护
FreeRTOS中关于临界区的定义:
#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()
#define taskEXIT_CRITICAL_FROM_ISR(x) portCLEAR_INTERRUPT_MASK_FROM_ISR(x)
#define portENTER_CRITICAL() vPortEnterCritical()
#define portEXIT_CRITICAL() vPortExitCritical()
可以看到,临界区保护其实是两个宏定义,具体实现在port.c文件中,如下所示:
void vPortEnterCritical(void)
portDISABLE_INTERRUPTS();
if (uxCriticalNesting == 1)
configASSERT((portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK) == 0);
void vPortExitCritical(void)
configASSERT(uxCriticalNesting);
if (uxCriticalNesting == 0)
临界区源码说明:
中断中的临界区代码:
void TIM3_IRQHandler(void)
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
status_value = taskENTER_CRITICAL_FROM_ISR();
printf("float_num 的值为: %d\r\n", total_num);
taskEXIT_CRITICAL_FROM_ISR(status_value);
说明:
注意:
临界区代码一定要精简!因为进入临界区会关闭中断,这样会导致优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断得不到及时的响应!
转载于:https://blog.csdn.net/dingyc_ee/article/details/104088202
文章评论(0条评论)
登录后参与讨论