FreeRTOS 学习笔记0920

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()  使用动态的方法创建一个任务




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值