FreeRTOS学习笔记

1、xTaskCreate(vTask_A,”Task A”,120,NULL,1,&xHandle);
这里创建了一个任务,任务优先级为1,由于硬件平台是32为架构,所以指定了120*4=480字节的任务堆栈,
向任务函数vTask_A()传递的参数为空(NULL),任务句柄由变量xHandle保存。

2、Cortex-M3中断优先级数值越大,表示优先级越低。而FreeRTOS的任务优先级则与之相反:
优先级数值越大的任务,优先级越高。根据官方统计,在Cortex-M3硬件上使用FreeRTOS,绝大多数的问题都出在优先级设置不正确上。

3、在Cortex-M3架构中,FreeRTOS为了任务启动和任务切换使用了三个异常:SVC、PendSV和SysTick。
SVC(系统服务调用)用于任务启动,有些操作系统不允许应用程序直接访问硬件,而是通过提供一些系统服务函数,通过SVC来调用;
PendSV(可挂起系统调用)用于完成任务切换,它的最大特性是如果当前有优先级比它高的中断在运行,PendSV

4、RTOS中断嵌套方案将有效的中断优先级分成两组:一组可以通过RTOS临界区屏蔽,另一组不受RTOS影响,永远都是使能的。宏configMAX_SYSCALL_INTERRUPT_PRIORITY在FreeRTOSConfig.h中配置,定义两组中断优先级的边界。
逻辑优先级高于此值的中断不受RTOS影响。最优值取决于微控制器使用的优先级配置寄存器的位数。

上文中已经描述,那些在中断服务例程中调用RTOS API函数的中断逻辑优先级必须低于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY(低逻辑优先级意味着高优先级数值)。

5、在任务中定义的局部变量,会优先使用寄存器,寄存器不够时就使用任务堆栈的空间。

6、在此之前,静态变量uxTopReadyPriority同样已经包含处于就绪态任务的最高优先级的信息。
与通用方法中使用任务优先级数值不同,在特殊方法中,uxTopReadyPriority使用每一位来表示任务,
比如变量uxTopReadyPriority的bit0为1,则表示存在优先级为0的就绪任务,bit10为1则表示存在优先级为10的就绪任务。
由于32位整形数最多只有32位,因此使用这种特殊方法限定最大可用优先级数目为32,即优先级0~31。

7、这两句代码用来退出临界区,通过向寄存器BASEPRI写入数值0来实现。
mov r0, #0                   /* 退出临界区*/
msr basepri, r0

8、队列是FreeRTOS主要的任务间通讯方式。可以在任务与任务间、中断和任务间传送信息。
发送到队列的消息是通过拷贝实现的,这意味着队列存储的数据是原数据,而不是原数据的引用。

9、

QueueHandle_t xQueueGenericCreate( 
              
const UBaseType_t uxQueueLength, 
              
const UBaseType_t uxItemSize, 
             
uint8_t *pucQueueStorage, 
             
StaticQueue_t *pxStaticQueue, 
             
const uint8_t ucQueueType )


/* 如果使能可视化跟踪调试,这里用来消除编译器警告. */
    ( void ) ucQueueType;

10、宏portTICK_PERIOD_MS可以用来辅助计算真实延时值。

11、互斥量不可以在中断中使用。对于互斥量要复杂些,因为互斥量具有优先级继承机制。

12、和普通版本的释放信号量API函数不同,它不能释放互斥量,这是因为互斥量不可以在中断中使用!
互斥量的优先级继承机制只能在任务中起作用,在中断中毫无意义。

13、那么什么是优先级反转呢?还是看上面的例子,任务C的优先级高于任务A,但是任务C因为没有获得互斥量而进入阻塞,只能等待低优先级的任务A释放互斥量后才能运行,这种情况就是优先级反转。

 

你可能感兴趣的:(自己的小笔记)