【具体问题】【求助】时间触发的调度器,任务该怎么分配

2020-01-20 19:07发布

本帖最后由 meirenai 于 2013-7-8 17:05 编辑

    现在在做一个小东西,用的是STC15F系列的单片机,这个片子有两个串口,但是需要使用4个串口设备,没办法只能复用串口了。
    在设计任务的初期我使用了时间触发的调度器来搭建程序框架,调度周期选择10ms,但是现在出现了一些问题,有两个任务搞得我比较心烦
    硬件设计中我把上位机通讯的串口和SIM900发送短信的串口用的是同一组串口,也就是这两个任务必须分时复用串口,单片机在与上位机通讯的任务中担任从机的任务,所有的通讯建立必须由上位机发起,下位机接收到数据后,根据命令返回响应的数据,也就是说这个上位机通讯任务必须时刻监视着串口以便接收到上位机发送的数据,接收和发送总的数据量最大有200字节。另一个SIM900任务主要的工作就是当某个标志位置位以后发送带有数据的短信,短信数据大约有70-100个字节的样子,这样就出现了问题,两个任务发送数据都超过了10ms的调度周期,这样就会出现程序的堵塞,导致按键液晶等响应变慢甚至丢失。还有一种情况是当SIM900访问串口时,上位机正好发来了命令,由于SIM900正在访问串口所以不能检测到这个命令,这个命令也就丢失了。
    还有一个问题是SIM900发送短信过程中需要较长的时间才能返回CMGS  ok 命令,这个过程中只能等待命令返回正确才能将串口切换到上位机通讯任务上,加剧了上位机发送信息丢失的问题。问题基本就是这样,思维有点乱,希望各位能给我一些建议,浪费大家的时间还请多多包含。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
zhwm3064
1楼-- · 2020-01-21 19:16
改20ms试试,另一个一个字节发出试试,另加大波特率试试
meirenai
2楼-- · 2020-01-22 00:31
coleyao 发表于 2013-12-29 18:28
任务执行一次不一定要发送一串数据,可以是每次一个字节,我最近用时间触发的方式做了个stm32cm0程序,里 ...

嗯,问题已经解决,采用了模拟串口的方式,上位机的指令不会耽误,SIM900发短信的时候会阻塞系统3-5秒,
系统资源紧张,换用你说的思路来发送SIM900的数据应该可行,但是接收SIM900 的命令响应如果用模拟串口的话必须是要死等的。这个问题我认为无解。
现在的系统也差不多能应付的过来,不会产生很严重的阻塞,除了处理发送短信任务会阻塞外,其他的AT命令响应还是很快的。满足要求。嘿嘿。
说的比较乱,见谅
coleyao
3楼-- · 2020-01-22 05:23
meirenai 发表于 2013-12-29 19:36
嗯,问题已经解决,采用了模拟串口的方式,上位机的指令不会耽误,SIM900发短信的时候会阻塞系统3-5秒,
...

不知道你用到的串口波特率是多少,用的哪些资源模拟串口的(外部中断+定时中断还是仅定时中断?),一般波特率不高(9600)的时候,就算是模拟的串口收发,合理分派资源的话也用不着阻塞其它任务的!
meirenai
4楼-- · 2020-01-22 11:12
 精彩回答 2  元偷偷看……
coleyao
5楼-- · 2020-01-22 13:23
meirenai 发表于 2013-12-30 08:57
只用的定时器当做精确延时,什么中断都没用,用外部中断+定时器中断编程太复杂了,感觉程序运行起来容易 ...

用外部中断+定时器会稍好一点,有下降沿就开始接收了,只用定时中断的话最大要慢一个扫描周期,而且因为不是从固定的位置开始扫描,同样的扫描频率,接收的可靠性要稍低一些(当然做好了的话两个方法差别不大,只是要挖掘最大波特率潜力的时候会有明显差异),我以前写过无线编解码的程序就是两个中断配合做的,外部中断只判断是否有收到数据,剩下的都是定时中断处理。
meirenai
6楼-- · 2020-01-22 14:57
coleyao 发表于 2013-12-30 09:19
用外部中断+定时器会稍好一点,有下降沿就开始接收了,只用定时中断的话最大要慢一个扫描周期,而且因为 ...

恩,这样的确能解决问题,我考虑一下,多谢了。

一周热门 更多>