OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4304|回复: 5

两个串口在某个时间点需要同时处理任务,请问怎么处理?

[复制链接]

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2021-3-24 09:13:39 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 lyy26655 于 2021-3-24 10:34 编辑

有以下几个问题,请各位大佬指正,谢谢:

1)在定时器内设标志位,每3分钟通过串口A发送一次数据,每1分钟通过串口B通过开关切换器74HC4052接收4次数据,那如果在第3分钟的时候,串口B正好进入了中断处理,此时串口A发送不了数据,
这个怎么解决呢?靠把B的中断优先级降低可以解决吗?


2)关于while(1)里函数是否能执行完的问题

各个任务A B C D时长见图,

如果ABC三个函数运行时间都非常短,假设有一个SystemTask()里面同时运行ABC三个函数,但时间比较长,请问:while(1)是会执行完三个函数TaskA TaskB TaskC再执行下一次while里的SystemTask(),
还是执行不完,假设时间只够TaskA TaskB,TaskC是不是就执行不了呢?

3)假设数组uint8_t datalenth[]={0x03,0x00,0x15} 目前0x15这个数据是一串字符串uint8_t data人工数出来再转为16进制的长度,想请问怎么通过

strlen(data)得出data的长度,并转为16进制,加上0x前缀,赋值到数组元素datalenth[2]里呢?

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

刚刚搜索到的 关于多任务可参考此博文:https://blog.csdn.net/firehood_/article/details/7791225
1.png

最佳答案

查看完整内容[请看2#楼]

首先除非你的数据量特别大,一般串口发送也就几毫秒的事,所以a顶多等个几毫秒就能发送,应该不会影响使用。如果确保发,那就设置下优先级,也可以通过dma方式发送。 其次问题2如果是多任务,这得分任务优先级了,高优先级的任务会挤占低优先级的任务的执行时间,但是所有任务都会执行,现在一般不会出现饿死任务的情况,除非自己的bug。 问题3就没太看懂,你是要保存0x15这个字符串吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2021-3-24 09:13:40 | 显示全部楼层
首先除非你的数据量特别大,一般串口发送也就几毫秒的事,所以a顶多等个几毫秒就能发送,应该不会影响使用。如果确保发,那就设置下优先级,也可以通过dma方式发送。
其次问题2如果是多任务,这得分任务优先级了,高优先级的任务会挤占低优先级的任务的执行时间,但是所有任务都会执行,现在一般不会出现饿死任务的情况,除非自己的bug。
问题3就没太看懂,你是要保存0x15这个字符串吗?
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-3-24 10:13:27 | 显示全部楼层
帮顶!
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2021-3-24 10:30:02 | 显示全部楼层
本帖最后由 lyy26655 于 2021-3-24 10:31 编辑
a5820736 发表于 2021-3-24 10:26
首先除非你的数据量特别大,一般串口发送也就几毫秒的事,所以a顶多等个几毫秒就能发送,应该不会影响使用 ...

本小白非常感谢您的解答^^
问题3是 比如通过 strlen 获取 uint8_t data长度,strlen(data)出来的datalenth(变量)是十进制的数,想把它转为十六进制,存到数组元素temp[2]里,请问
这个怎么做呢?
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
824
金钱
824
注册时间
2013-6-5
在线时间
142 小时
发表于 2021-3-24 10:47:25 | 显示全部楼层
datalenth[2]=strlen(data);

0x15 是给你用的,机器不用,
你还要好好学学,估计你是自学的,找个老师吧。
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2021-3-24 11:04:36 | 显示全部楼层
zhxzhx 发表于 2021-3-24 10:47
datalenth[2]=strlen(data);

0x15 是给你用的,机器不用,

的确是自学的 谢谢您
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 21:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表