临界区:临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。临界区给那些重要的代码。
FreeRTOS在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中FreeRTOS系统本身就有很多的临界段代码,这些代码都加了临界
段代码保护,我们在写自己的用户程序的时候有些地方也需要添加临界段代码保护。
示例1:串口中断的抢占优先级为6,优先级小于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,当任务1代码进入临界区时,串口中断服
务函数无法响应。
示例2:串口中断的抢占优先级为4,优先级大于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,当任务1代码进入临界区时,串口中断服
务函数还能够正常响应。
函数taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()中断级别临界段代码保护,是用在中断服务程序中的,而且这个中断的优先
级一定要低于configMAX_SYSCALL_INTERRUPT_PRIORITY。
中断函数的抢占优先级设置为
configMAX_SYSCALL_INTERRUPT_PRIORITY,因为使用在中断使用taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()函数,进入临界区,中断函数的抢占优先级低于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY常数(优先级低于,数值大于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY常数),为了保护临界区,中断不能正常进行。若要在中断函数中调用freertos的api接口,如传递消息队列等等,抢占优先级小于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY常数。
即:为了保护临界区,中断函数的抢占优先级要小于或等于(等于configMAX_SYSCALL_INTERRUPT_PRIORITY常数,不触发中断)configMAX_SYSCALL_INTERRUPT_PRIORITY常数(在临界区内,不触发中断),
在中断函数内要调用api函数,中断函数的抢占优先级要小于或等于(等等于configMAX_SYSCALL_INTERRUPT_PRIORITY常数能够调用api函数)configMAX_SYSCALL_INTERRUPT_PRIORITY常数。选择configMAX_SYSCALL_INTERRUPT_PRIORITY作为抢占优先级。