configAPPLICATION_ALLOCATED_HEAP 定义为1需要用户自行堆内存ucHeap,否则的话
就是编译器来分配的。
heap_4.c
configASSERT(x)
xTaskCreateStatic()
configCHECK_FOR_STACK_OVERFLOW
configGENERATE_RUN_TIME_STATS
设置为1开启时间统计功能
configIDLE_SHOULD_YIELD 为1的时候空闲任务就会为处于同等优先级的用户任务让出
CPU使用权。
configMAX_CO_TOUTINE_PRIORITIES
configMAX_PRIORITIES
configMAX_TASK_NAME_LEN
configMINIMAL_STACK_SIZE
configQUEUE_TEGISTRY_SIZE
configTICK_RATE_HZ
configTIMER_TASK_PRIORITY
xReturn = xTimerCreateTimerTask(); 这个任务是怎么来应用的???
configUSE_16_BIT_TICKS
为1的时候TickType_t 是16位的, 为0 TickType_t 是32位的
configUSE_COUNTING_SEMAPHORES
设置为1的时候启用计数型信号量,相关的API函数会被编译。
configUSE_IDLE_HOOK
configUSE_MUTEXES
configUSE_PORT_OPTIMISED_TASK_SELECTION
configUSE_PREEMPTION
为1时使用抢占式调度器,为0时使用协程。
configUSE_QUEUE_SETS
configUSE_TASK_NOTIFICATIONS
为1的时候使用任务通知功能,开启了此功能的话每个任务会多消耗8个字节。
开启和不开启有什么区别????
configUSE_TICKLESS_IDLE
为1时使能低功耗tickless模式。 开启低功耗是怎么运行的???
configUSE_TIMERS
为1时使用软件定时器。。 什么时候开启软件定时器???
configUSE_TIME_SLICING
为1 时优先级相同的任务在时钟节拍中断中进行切换,为0时,不会在时钟节拍中断执行
相同优先级任务的任务切换。。
Cortex-M 内核的MCU提供了一个用于中断管理的嵌套向量中断控制器(NVIC)。
Cotex-M3和M4的NVIC最多支持240个IRQ(中断请求)、1个不可屏蔽中断(NMI)、1个Systick
(滴答定时器)定时器中断和多个系统异常。
三个中断屏蔽寄存器:PRIMASK、FAULTMASK和BASEPRI。
STM32有16级优先级。
为了使抢占机能变得更可控,Cortex-M处理器还把256个优先级按位分为高低两端:
抢占优先级(分组优先级)和亚优先级(子优先级),NVIC中有一个寄存器是
“应用程序中断及复位控制寄存器(AIRCR)”,AIRCR寄存器里面有个位段名为“优先级组”。
[10:8] PRIGROUP 优先级分组
STM32使用了4位,因此最多有5组优先级分组设置。
NVIC_PRIORITYGROUP_4
如果选择NVIC_PRIORITYGROUP_4的话,那4位优先级就都全是抢占优先级了,没有亚优先级
,那么就有0-15共16个优先级。
PRI_12 0xE000_ED20 调试监视器的优先级
... 0xE000_ED21 ...
PRI_14 0xE000_ED22 PendSV的优先级
PRI_15 0xE000_ED23 SysTick的优先级
因为FreeRTOS在设置PendSV和SysTick的中断优先级的时候都是直接操作的地址0xE000_ED20
用于中断屏蔽的特殊寄存器
PRIMASK和FAULTMASK寄存器
在许多应用中,需要暂时屏蔽所有的中断执行一些对时序要求严格的任务,这个时候就可以
使用PRIMASK寄存器,PRIMASK用于禁止除NMI和HardFault外的所有异常和中断,
CPSIE I; //清除PRIMASK(使能中断)
CPSID I; //设置PRIMASK(禁止中断)
PRIMASK寄存器还可以通过MRS和MSR指令访问,如下:
MOVS R0, #1
MSR PRIMASK, R0;
FAULTMASK比PRIMASK更狠,它可以连HardFault都屏蔽掉,FAULTMASK会在退出时自动清零。
BASEPRI寄存器
屏蔽优先级不高于0x60的中断,
MOV R0, #0X60
MSR BASEPRI, R0
取消BASEPRI对中断的屏蔽
MOV R0, #0
MSR BASEPRI, R0
注意!FreeRTOS的开关中断就是操作BASEPRI寄存器来实现的!它可以关闭低于某个阀值的中断
,高于这个阀值的中断就不会被关闭。
configPRIO_BITS
此宏用来设置MCU使用几位优先级,STM32使用的是4位,因此此宏为4
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
此宏用来设置最低优先级
configKERNEL_INTERRUPT_PRIORITY
此宏用来设置内核中断优先级,
portNVIC_SYSPRI2_REG
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
此宏用来设置FreeRTOS系统可管理的最大优先级,BASEPRI寄存器说的那个阀值优先级,这里
设置为5,也就是高于5的优先级不归FreeRTOS管理。
FreeRTOS开关中断函数为portENABLE_INTERRUPTS()和portDISABLE_INTERRUPTS()
FreeTROS与临界段代码保护有关的函数有4个: taskENTER_CRITICAL()、taskEXIT_CRITICAL()、
任务级的临界段代码保护
taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()
中断级的临界代码保护
taskENTER_CRITICAL()、taskEXIT_CRITICAL()
#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()
注意临界区代码一定要精简,因为进入临界区会关闭中断,这样会导致优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的
中断得不到及时的响应。
中断级临界段代码保护
taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()
用在中断服务程序中,而且这个中断的优先级一定要低于configMAX_SYSCALL_INTERRUPT_PRIORITY
#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
4.5 FreeRTOS 中断测试实验
start_task() interrupt_task()
portDISABLE_INTERRUPTS()
第五章 FreeRTOS任务基础知识
任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用函数vTaskDelete(NULL)删除此任务。
任务控制块
typedef tskTCB TCB_t;
第六章 FreeRTOS任务相关API函数
xTaskCreate() 使用动态的方法创建一个任务
就是编译器来分配的。
heap_4.c
configASSERT(x)
xTaskCreateStatic()
configCHECK_FOR_STACK_OVERFLOW
configGENERATE_RUN_TIME_STATS
设置为1开启时间统计功能
configIDLE_SHOULD_YIELD 为1的时候空闲任务就会为处于同等优先级的用户任务让出
CPU使用权。
configMAX_CO_TOUTINE_PRIORITIES
configMAX_PRIORITIES
configMAX_TASK_NAME_LEN
configMINIMAL_STACK_SIZE
configQUEUE_TEGISTRY_SIZE
configTICK_RATE_HZ
configTIMER_TASK_PRIORITY
xReturn = xTimerCreateTimerTask(); 这个任务是怎么来应用的???
configUSE_16_BIT_TICKS
为1的时候TickType_t 是16位的, 为0 TickType_t 是32位的
configUSE_COUNTING_SEMAPHORES
设置为1的时候启用计数型信号量,相关的API函数会被编译。
configUSE_IDLE_HOOK
configUSE_MUTEXES
configUSE_PORT_OPTIMISED_TASK_SELECTION
configUSE_PREEMPTION
为1时使用抢占式调度器,为0时使用协程。
configUSE_QUEUE_SETS
configUSE_TASK_NOTIFICATIONS
为1的时候使用任务通知功能,开启了此功能的话每个任务会多消耗8个字节。
开启和不开启有什么区别????
configUSE_TICKLESS_IDLE
为1时使能低功耗tickless模式。 开启低功耗是怎么运行的???
configUSE_TIMERS
为1时使用软件定时器。。 什么时候开启软件定时器???
configUSE_TIME_SLICING
为1 时优先级相同的任务在时钟节拍中断中进行切换,为0时,不会在时钟节拍中断执行
相同优先级任务的任务切换。。
Cortex-M 内核的MCU提供了一个用于中断管理的嵌套向量中断控制器(NVIC)。
Cotex-M3和M4的NVIC最多支持240个IRQ(中断请求)、1个不可屏蔽中断(NMI)、1个Systick
(滴答定时器)定时器中断和多个系统异常。
三个中断屏蔽寄存器:PRIMASK、FAULTMASK和BASEPRI。
STM32有16级优先级。
为了使抢占机能变得更可控,Cortex-M处理器还把256个优先级按位分为高低两端:
抢占优先级(分组优先级)和亚优先级(子优先级),NVIC中有一个寄存器是
“应用程序中断及复位控制寄存器(AIRCR)”,AIRCR寄存器里面有个位段名为“优先级组”。
[10:8] PRIGROUP 优先级分组
STM32使用了4位,因此最多有5组优先级分组设置。
NVIC_PRIORITYGROUP_4
如果选择NVIC_PRIORITYGROUP_4的话,那4位优先级就都全是抢占优先级了,没有亚优先级
,那么就有0-15共16个优先级。
PRI_12 0xE000_ED20 调试监视器的优先级
... 0xE000_ED21 ...
PRI_14 0xE000_ED22 PendSV的优先级
PRI_15 0xE000_ED23 SysTick的优先级
因为FreeRTOS在设置PendSV和SysTick的中断优先级的时候都是直接操作的地址0xE000_ED20
用于中断屏蔽的特殊寄存器
PRIMASK和FAULTMASK寄存器
在许多应用中,需要暂时屏蔽所有的中断执行一些对时序要求严格的任务,这个时候就可以
使用PRIMASK寄存器,PRIMASK用于禁止除NMI和HardFault外的所有异常和中断,
CPSIE I; //清除PRIMASK(使能中断)
CPSID I; //设置PRIMASK(禁止中断)
PRIMASK寄存器还可以通过MRS和MSR指令访问,如下:
MOVS R0, #1
MSR PRIMASK, R0;
FAULTMASK比PRIMASK更狠,它可以连HardFault都屏蔽掉,FAULTMASK会在退出时自动清零。
BASEPRI寄存器
屏蔽优先级不高于0x60的中断,
MOV R0, #0X60
MSR BASEPRI, R0
取消BASEPRI对中断的屏蔽
MOV R0, #0
MSR BASEPRI, R0
注意!FreeRTOS的开关中断就是操作BASEPRI寄存器来实现的!它可以关闭低于某个阀值的中断
,高于这个阀值的中断就不会被关闭。
configPRIO_BITS
此宏用来设置MCU使用几位优先级,STM32使用的是4位,因此此宏为4
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
此宏用来设置最低优先级
configKERNEL_INTERRUPT_PRIORITY
此宏用来设置内核中断优先级,
portNVIC_SYSPRI2_REG
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
此宏用来设置FreeRTOS系统可管理的最大优先级,BASEPRI寄存器说的那个阀值优先级,这里
设置为5,也就是高于5的优先级不归FreeRTOS管理。
FreeRTOS开关中断函数为portENABLE_INTERRUPTS()和portDISABLE_INTERRUPTS()
FreeTROS与临界段代码保护有关的函数有4个: taskENTER_CRITICAL()、taskEXIT_CRITICAL()、
任务级的临界段代码保护
taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()
中断级的临界代码保护
taskENTER_CRITICAL()、taskEXIT_CRITICAL()
#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()
注意临界区代码一定要精简,因为进入临界区会关闭中断,这样会导致优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的
中断得不到及时的响应。
中断级临界段代码保护
taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()
用在中断服务程序中,而且这个中断的优先级一定要低于configMAX_SYSCALL_INTERRUPT_PRIORITY
#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
4.5 FreeRTOS 中断测试实验
start_task() interrupt_task()
portDISABLE_INTERRUPTS()
第五章 FreeRTOS任务基础知识
任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用函数vTaskDelete(NULL)删除此任务。
任务控制块
typedef tskTCB TCB_t;
第六章 FreeRTOS任务相关API函数
xTaskCreate() 使用动态的方法创建一个任务