1)线程的状态
活跃态 (ACTIVE) 就绪态(READY)
运行态(RUNNING)
等待态(WAIT_...)
不活跃态(INACTIVE)
各个状态转换图如下:
RTOSV2
RTOSV1
CMSIS-RTOS是抢占式(pre-emptive),就绪态处于高优先级会先运行,处于就绪态相同优先级的线程会使用时间片轮转调度器获取运行时间片
2、CMSIS-FreeRTOS定时器管理(Timer Management)学习
1)创建定时器
2)启动定时器
3)删除定时器
4)停止定时器
注意:定时器回调函数不是while循环
3、CMSIS-FreeRTOS内部线程通讯与资源共享(Inter-Thread Communication and Resource Saharing)学习
1)信号事件(Signal Events)
同步线程,触发可执行状态
2)消息队列(Message Queue)
fifo-like,从固定地址读取数据,实际的数据在线程之间传递(实际数据放到队列里发送出去),发送数据类型为整型或指针,发送之前可以申请格式化的内存块,官方给的Demo也支持类似邮箱队列操作
osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec),该函数buf参数是无符号整型变量,即可将buf地址值作为参数传递进来,该函数里调用了xQueueSend(queue_id, &info, ticks),即如果传递进来的是buf指针,则最终实际传输的也是指针,将我们要发送数据的buf指针放到队列里发送出去,如果编程传递进来的是实际数据的变量,则最终实际传输的数据就是我们要发送的数据放到队列里。故消息队列既有邮箱队列功能又有传输实际数据功能,因此CMSIS-RTOSV2取消了邮箱队列功能可能是这个原因。
3)内存池(Memory Pool)
4)邮箱队列(Mail Queue)
数据放在固定内存块,内存块指针在线程之间移动来传递数据(将内存块指针变量的值放到队列里发送出去),发送数据类型为一个memory block,发送之前需要申请格式化的内存块
osMailPut(osMailQId queue_id, void *mail),该函数buf参数为void指针,即可传递buf的指针,但函数里面调用的是xQueueSend(queue_id->handle, &mail, 0),即对buf指针再次取地址传递,该函数的作用是将&mail地址的数据copy到队列里发送出去,而&mail的地址是我们要发送的buf的数据地址,即将buf数据地址作为数据放到队列里,故邮箱队列传递的数据实际是指针。
5)互斥锁(Mutexes)
是信号量的特殊情况,一个线程只能访问一个共享资源同一时刻,
6)信号量(Semaphores)
相当于数值型信号量,多个线程可以访问多个资源同一时刻,递减计数器
优先级反转:当一个任务A的优先级高于任务B的优先级,则正常情况下会出现任务A一直运行,但实际出现了任务B一直运行,违反了实时操作系统(内核抢占式)处于就绪态的高优先级先运行的原则,称该现象叫做优先级反转
后续会根据理解接着补充...