这里主要提几个与PIC32MX微处理器的特性有关的配置项,其他通用的配置请参考 FreeRTOS系列第6篇—FreeRTOS内核配置说明/* Interrupt nesting behaviour configuration. */
/* The priority at which the tick interrupt runs. This should probably be kept at 1. */
#define configKERNEL_INTERRUPT_PRIORITY 1
/* The maximum interrupt priority from which FreeRTOS.org API functions can be called.
Only API functions thatendin ...FromISR() can be used within interrupts. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 6
PIC32MX的中断优先级为1-7,其中1最低,7最高。低优先级的中断触发的中断服务程序可以被高优先级的中断打断,从而执行更紧急的中断服务程序。
系统定时器中断使用最低优先级1,其可以被中断优先级为2-7的中断嵌套。
优先级为2-6的中断触发的中断服务程序里,可以使用FreeRTOS提供的后缀为FromISR()的API函数。
优先级为7的中断触发的中断服务程序不受FreeRTOS的影响,且不可以使用后缀为FromISR()的API函数。
设置configMAX_SYSCALL_INTERRUPT_PRIORITY的意义在于,使一些中断服务函数可以使用自己的栈空间。不高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断服务程序都使用相同的中断栈空间。
/* Records the interrupt nesting depth. This is initialised to one asitis
decremented to0 when thefirst task starts. */
volatile UBaseType_t uxInterruptNesting = 0x01;
/* Stores the task stack pointer when a switch is made to use the system stack. */
UBaseType_t uxSavedTaskStackPointer = 0;
/* The stack used by interrupt service routines that cause a context switch. */
StackType_t xISRStack[ configISR_STACK_SIZE ] = { 0 };
/* The top of stack value ensures there is enough spaceto store 6 registers onthe callers stack, assome functions seem to want to do this. */
const StackType_t * const xISRStackTop = &( xISRStack[ configISR_STACK_SIZE - 7 ] );
uxInterruptNesting用来标示中断嵌套层数。每进入一次中断,uxInterruptNesting值自加;每退出一次中断,uxInterruptNesting自减。嵌套次数越多,这个数越大。程序在保存现场时使用这个值来判断是将CPU寄存器组压入任务栈还是中断栈。
uxSavedTaskStackPointer用来在进入中断服务程序前保存任务栈,在退出中断服务程序时将sp指针指向任务栈。
xISRStack是中断服务程序用到的栈。进入中断服务程序时,sp指针被指向这个中断栈的顶部xISRStackTop;退出中断服务程序时,sp指针恢复到任务的栈指针uxSavedTaskStackPointer。
明确了这几个变量的用途后,程序编写时需要注意如下几点: