修改串口的图

master
高宏宇 11 months ago
parent 2fc67b6780
commit 8e93d0bc44

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

@ -328,3 +328,55 @@ const osThreadAttr_t comTask_attributes = { .name = "comTask", .stack_size = 128
# 3. 任务的同步和通知
在一个复杂的系统中,往往把一个复杂的任务分解成为很多相对独立的小任务,任务和任务之间协调工作。这样做做有很多好处,有点像变成过程中的函数,都是把一个复杂的问题转变成为一系列的简单问题进行求解和管理。但任务划分和函数划分还是有很多区别。
1. 函数划分的目的除了把复杂问题拆分成简单外,更总要的作用是代码复用和降低代码耦合;任务划分同样是把复杂的问题简化成一系列简单的问题,但是内涵是协作分工以及对关键资源的管理。
2. 在操作系统中,任务函数的功能往往是多个函数的聚合,功能较复杂;而从编程的角度看,普通的函数往往功能单一,更抽象;
3. 在任务中,需要考虑多个任务的协调工作,这就好比管理一个企业,或者是一支军队;而普通的函数一般不关系协作的问题,一般只有简单的堆栈调用;
4. 任务中的协作一般包含两个层次的内涵:
1. 优先级,优先级高的会打断优先级低的任务(抢占);
2. 同步:某些任务需要等待其他任务执行完成后才能执行;硬件资源的管理属于同步的一个特殊应用,例如串口被多个任务使用,任务需要排队。
在复杂的操作系统中往往有进程、线程等概念在FreeRTOS中没有区分这么细致。你可以理解成只有线程。
## 3.1. 信号量
信号量一般代表可用资源的数量,可以分为二值信号量和计数信号量。
1. 二值信号量二值信号量是取值只能为0或1的信号量用于表示某种事件是否发生或条件是否满足取值为0时表示事件没有发生取值为1时表示事件已经发生。二值信号量的初始值一般设置为0当一个任务需要和其他任务协同工作时可以发出同步信号调用RTOS提供的信号量发送函数使二值信号量的值变为1。另一个任务在需要任务同步的地方调用 RTOS提供的信号量获取函数。此时该任务的执行情况分为两种如果二值信号量已经为1则将二值信号量清零并继续运行下去如果二值信号量为0则该任务由运行态转为阻塞态等待二值信号量变为有效(为1)。二值信号量有效后,该任务才会由阻塞态变为就绪态,等待RTOS的调度。
2. 计数信号量计数信号量主要用于资源的计数它的初始值一般为可用资源的数量。例如我们在酒店就餐时酒店所提供的餐桌数量是固定的。现在设计一个计数器其初值为最大的餐桌数。假设一人占用一张餐桌每进去一人计数器就会自动减一每出来一人计数器自动加一。如果计数器的值大于0酒店就允许客人进去就餐否则就等待直到有空余的餐桌出现。
### 3.1.1. 接口函数
#### 3.1.1.1. 信号量创建函数osSemaphoreNew
![image-20241008111948078](./img/image-20241008111948078.png)
#### 3.1.1.2. 信号量获取函数osSemaphoreAcquire
![image-20241008112051872](./img/image-20241008112051872.png)
#### 3.1.1.3. 信号量释放函数osSemaphoreRelease
![image-20241008112134863](./img/image-20241008112134863.png)
### 3.1.2. 二值信号量的应用
## 3.2. 事件标志组
## 3.3. 线程标志
## 3.4. 互斥量
## 3.5. 消息队列
## 3.6. 软件定时器

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Loading…
Cancel
Save