stm32单片机下使用FreeRTOS编程,如何划分任务及任务间如何通信呢?

ba_wang_mao 2019-12-05 11:16:14
我是FreeRTOS的菜鸟,想在STM32下使用FreeRTOS编程。

今有如下设备
(1)、USART1通过通信采集2个压力数据
(2)、USART2通过通信采集2个温度数据
(3)、AD7708模拟量输入芯片采集3路传感器信号数据

现在要想通过USART3将2个压力数据、2个温度数据、3路传感器信号数据传输给上位机。

请问:

(1)、该如何划分任务?
是依据一个串口划分一个任务或者依据AD7708模入芯片划分一个任务呢?还是其它呢?
(2)、我下面划分任务是否合理
USART1划分一个任务,USART1接收中断通过发送信号量通知该任务开始运行。
USART2划分一个任务,USART2接收中断通过发送信号量通知该任务开始运行。
AD7708划分一个任务,该任务是一个周期性任务,每隔100毫秒执行一次
USART3划分一个任务,当收到上位机的请求后,将数据发送给上位机。
(3)、USART1任务、USART2任务、AD7708任务的数据如何传输给USART3的任务呢?
...全文
1165 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ba_wang_mao 2019-12-11
  • 打赏
  • 举报
回复
任务的优先级安排原则如下:

1)、中断关联性:与中断服务程序(ISR)有关联的任务应该安排尽可能高的优先级,以便及时处理异步事件,提高系统的实时性。如果优先级安排得比较低,则CPU有可能被优先级比较高的任务长期占用,以致于在第二次中断发生时连第一次中断还没有处理,从而产生信号丢失现象;
2)、紧迫性:因为紧迫任务对响应时间有严格要求,在所有紧迫任务中,按响应时间要求排序,越紧迫的任务安排的优先级越高。紧迫性为最高原则。紧迫任务通常与ISR关联。
3)、关键性:任务越关键安排的优先级越高,以保障其执行机会。
4)、频繁性:对于周期性任务,执行越频繁,则周期越短,允许耽误的时间也越短,故应该安排的优先级也越高,以保障及时得到执行。
5)、快捷性:在前面各项条件相近时,越快捷(耗时短)的任务安排的优先级越高,以使其他就绪任务的延时缩短。
6)、传递性:信息传递的上游任务的优先级高于下游任务的优先级,如信号采集任务的优先级高于数据处理任务的优先级。
ba_wang_mao 2019-12-11
  • 打赏
  • 举报
回复
任务划分小结:
关键任务:必须得到运行机会的,如火灾监控
紧迫任务:必须尽快执行的

1)、首先,以CPU为中心,将与各种输入/输出设备(或端口)相关的功能分别划分为独立的任务;
2)、发现“关键”功能,将其最“关键”部分“剥离”出来,用一个独立任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通;
3)、发现“紧迫”功能,将其最“紧迫”部分“剥离”出来,用一个独立的高优先级任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通;
4)、对于既“关键”又“紧迫”的功能,按“紧迫”功能处理;
5)、将消耗机时较多的数据处理功能划分出来,封装为较低优先级任务;
6)、将关系密切的若干功能组合成为一个任务,达到功能聚合的效果;
7)、将由相同事件触发的若干功能组合成为一个任务,从而免除事件分发机制;
8)、将运行周期相同的功能组合成为一个任务,从而免除时间事件分发机制;
9)、将若干按固定顺序执行的功能组合成为一个任务,从而免除同步接力通信的麻烦。
ba_wang_mao 2019-12-09
  • 打赏
  • 举报
回复
我准备这样设计任务:

设计消息队列协议
msg[0] = 1 表示传输2个压力数据
msg[0] = 2 表示传输2个温度数据
msg[0] = 3 表示传输3个通道传感器数据
msg[0] = 4 表示DMA接收上位机通信报文完毕

一、USART1划分一个任务,USART1接收中断中发送信号量通知该任务运行解析完报文后,得到2个压力数据,然后发送msg[0] = 1 消息队列, 传输给USART3任务。
二、USART2划分一个任务,USART2接收中断中发送信号量通知该任务运行解析完报文后,得到2个温度数据,然后发送msg[0] = 2 消息队列, 传输给USART3任务。
三、AD7708划分一个任务,该任务是一个周期性任务,每隔100毫秒执行一次,采集到传感器信号后,然后发送msg[0] =3 消息队列, 传输给USART3任务。
四、USART3接收上位机通信使用DMA中断(使用STM32F103的USART3空闲中断+DMA方式采集不定长的上位机报文),当检测到DMA接收完毕,然后发送msg[0] = 4 消息队列, 传输给USART3任务。

五、USART3划分一个任务
USART3_TASK()
{

while (1)
{
等待消息队列;
读取消息队列头字节
switch (消息队列头字节)
{
case 1:
读取2个压力数据
break;
case 2:
读取2个温度数据
break;
case 3:
读取3个通道的传感器数据
break;
case 4:
USART3通过DMA方式读取完毕上位机通信报文,解析上位机报文;
if (上位机报文检验通过)
{
给上位机发送压力、温度和传感器数据
}
break;
}

}
}
worldy 2019-12-07
  • 打赏
  • 举报
回复
那么,FreeRTOS会给你分配执行时间,不用太过操心时间问题
ba_wang_mao 2019-12-06
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
创建3个任务,分别采集数据,每个任务作业如果没有使用共同的资源,则当成独立的任务对待,如果使用共同资源,则需要加锁同步


假如USART1需要定时200毫秒【先给】设备发送一帧请求,设备收到请求报文后,【然后才给】USART1回送2个压力数据。
这时候如何设计和规划USART1任务呢?
worldy 2019-12-06
  • 打赏
  • 举报
回复 1
创建3个任务,分别采集数据,每个任务作业如果没有使用共同的资源,则当成独立的任务对待,如果使用共同资源,则需要加锁同步
ba_wang_mao 2019-12-06
  • 打赏
  • 举报
回复
假如USART1需要定时200毫秒【先给】设备发送一帧请求,设备收到请求报文后,【然后才给】USART1回送2个压力数据。
这时候如何设计和规划USART1任务呢?
efenwu 2019-12-06
  • 打赏
  • 举报
回复
资源多的话根据目前2的方法即可,任务数据可通过freertos里的队列发数据过去
ba_wang_mao 2019-12-06
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
需要准确的时间定时?


不需要准确的时间,大概即可。
worldy 2019-12-06
  • 打赏
  • 举报
回复
需要准确的时间定时?
ba_wang_mao 2019-12-06
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
创建3个任务,分别采集数据,每个任务作业如果没有使用共同的资源,则当成独立的任务对待,如果使用共同资源,则需要加锁同步

假如USART1需要定时200毫秒【先给】设备发送一帧请求,设备收到请求报文后,【然后才给】USART1回送2个压力数据。
这时候如何设计和规划USART1任务呢?
ba_wang_mao 2019-12-06
  • 打赏
  • 举报
回复
https://www.amobbs.com/thread-4642593-1-1.html?_dsign=d6ca4bf1

27,516

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧