OpenEdv-开源电子网

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

关于我想同时执行多个程序的问题

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2022-1-18
在线时间
15 小时
发表于 2022-5-21 15:22:19 | 显示全部楼层 |阅读模式
我有一块开发板,如何让它执行数码管实时显示温度程序的时候还能执行按键程序。现在的问题就是,数码管程序执行的时候其他程序都卡住了,比如超声波啊,led点亮啊,oled显示啊,都卡住了,执行不了,但是当数码管程序执行完毕之后它们又都能执行了,如何在数码管执行的时候,不影响其他程序正常执行呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2020-8-24
在线时间
92 小时
发表于 2022-5-23 14:16:11 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2022-1-18
在线时间
15 小时
 楼主| 发表于 2022-5-23 17:04:48 | 显示全部楼层
hehaiming 发表于 2022-5-23 14:16
上FreeRTOS,完美解决。

会说,我有这资源就好了,还有其他办法嘛,我写的好困难
回复 支持 反对

使用道具 举报

11

主题

114

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1128
金钱
1128
注册时间
2021-6-17
在线时间
206 小时
发表于 2022-5-23 17:21:09 | 显示全部楼层
本帖最后由 ZKX182 于 2022-5-23 17:23 编辑

如果是想在执行数码管的时候还能执行按键程序,你可以把按键做成中断触发;如果是后者,就上系统吧;
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2022-5-11
在线时间
6 小时
发表于 2022-5-23 20:36:25 | 显示全部楼层
不知道别人怎么解,我遇到类似的只有两个解法:
一个是楼上说的,上操作系统。但想来楼主估计是闪存不够,用不了。
如果坚持想跑前后台,led可以考虑用中断,超声波可以考虑把发和收与动态数码管放一个循环里面(但不能设置等待接受,错过就错过了)。
但这个玩法我是在51上这么干过,这样有概率会造成数码管“变暗”(也就是单位时间内循环闪动次数变少)。
不过你说的太模糊,建议直接上原代码。
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2022-1-18
在线时间
15 小时
 楼主| 发表于 2022-5-24 20:05:12 | 显示全部楼层
我不到啊 发表于 2022-5-23 20:36
不知道别人怎么解,我遇到类似的只有两个解法:
一个是楼上说的,上操作系统。但想来楼主估计是闪存不够, ...

void hc595_5STest(uint16_t num)
{       
          uint8_t temp = 0;
    uint8_t j = 0;
       
    if(num >= 9999)
        num = 0000;

    for(j = 0; j < 50; j++)
    {     
        // 数据选择
        temp = Display[num / 1000];
        HC595_Send(temp);
        SMG_Sele(0);  //数码管显示数据
                                HC595_RCK(1);
        Delay_Ms(5);
                       
        // 选择数据
        temp = Display_1[num / 100%10];
        HC595_Send(temp);
        SMG_Sele(1);  //数码管显示数据
        Delay_Ms(5);
        // 选择数据
        temp = Display[num / 10%10];
        HC595_Send(temp);
        SMG_Sele(2);  //数码管显示数据
        Delay_Ms(5);
        // 选择数据
        temp = Display[num % 10];
        HC595_Send(temp);
        SMG_Sele(3);  //数码管显示数据
                                Delay_Ms(5);
    }
}
/**************************************************************
这个就是数码管显示函数,执行一次就是1秒,在这1秒里面其他程序是动不了的,
有没有什么好的解决办法啊
*******************************************************************/
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2022-1-18
在线时间
15 小时
 楼主| 发表于 2022-5-24 20:13:04 | 显示全部楼层
上课放不下看 发表于 2022-5-24 20:05
void hc595_5STest(uint16_t num)
{       
          uint8_t temp = 0;

温度传感器又是实时显示,而数码管这边最多一秒一次,我设了一个定时器,两秒更新一次,然后就变成了两秒之内,一秒执行数码管,另外一秒可以执行其他程序,但执行数码管的时候动不了
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2022-5-11
在线时间
6 小时
发表于 2022-5-25 09:43:53 | 显示全部楼层
你的主芯片是什么型号的?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-5-25 09:57:33 | 显示全部楼层
上课放不下看 发表于 2022-5-24 20:05
void hc595_5STest(uint16_t num)
{       
          uint8_t temp = 0;

延时太多
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2022-1-18
在线时间
15 小时
 楼主| 发表于 2022-5-25 10:04:26 | 显示全部楼层
我不到啊 发表于 2022-5-25 09:43
你的主芯片是什么型号的?

f407
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2022-1-18
在线时间
15 小时
 楼主| 发表于 2022-5-25 10:04:57 | 显示全部楼层

不加延时,显示不出来,数码管就是闪烁状态了
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-5-25 10:28:50 | 显示全部楼层
上课放不下看 发表于 2022-5-25 10:04
不加延时,显示不出来,数码管就是闪烁状态了

不知道你那个for 50啥用  对于里面的4个5ms延时 可以做成四个函数 定时5ms执行一个就好了呀
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2022-1-18
在线时间
15 小时
 楼主| 发表于 2022-5-25 11:09:31 | 显示全部楼层
nashui_sx 发表于 2022-5-25 10:28
不知道你那个for 50啥用  对于里面的4个5ms延时 可以做成四个函数 定时5ms执行一个就好了呀

执行50次达到显示的效果,不然执行一次,只有20ms,肉眼根本看不出来
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-5-25 12:38:27 | 显示全部楼层
上课放不下看 发表于 2022-5-25 11:09
执行50次达到显示的效果,不然执行一次,只有20ms,肉眼根本看不出来

那就更没意义了    定时扫描就好了  10ms 扫描一个管子  不要延时就可以了
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2022-5-11
在线时间
6 小时
发表于 2022-5-25 15:02:05 | 显示全部楼层
本帖最后由 我不到啊 于 2022-5-25 15:06 编辑

楼主我感觉你的程序设计思路就是单线程的。
楼上说的对,如果你坚持不去掉Delay,那么此题无解。
我猜你的想法是:             刷新数码管>等待(Delay)>刷新>等待
如果我是你,我的写法是:
刷新数码管>做其他事>刷新>做其他事当然说起来容易,写程序会痛苦死。
所以如果非要跑前后台,你可以建一个定时中断。
定时50——100ms,中断里面更新检测。中断外面跑动态数码管。
回复 支持 反对

使用道具 举报

49

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2017-11-23
在线时间
133 小时
发表于 2022-5-26 08:50:49 | 显示全部楼层
我觉得数码管驱动得加数据锁存器,cpu直接驱动数码管,很考验cpu刷新速度的,加个显示鼠键锁存器后,cpu发一次显示数据给锁存器后,cpu就可以干别的事了,这时候锁存器再去驱动数码管,没有新信息更新时,数码管就显示当前信息,有新信息来到时,数码管再显示新信息,数码管是在实时显示信息状态中的,中间没有中断,观察的人当然看到的就是实时连续的信息了,
这样倒是会增加一小点成本的,
这种形式我在拆开的好多仪表里都看到过。
回复 支持 反对

使用道具 举报

9

主题

218

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1394
金钱
1394
注册时间
2020-5-12
在线时间
387 小时
发表于 2022-5-26 14:38:53 | 显示全部楼层
做成时间片轮询,去掉延时
回复 支持 反对

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2016-6-22
在线时间
31 小时
发表于 2022-5-28 16:41:00 | 显示全部楼层
为什么都喜欢用delay的延时卡在那里,改下轮询就行,开个中断计数,去比较时间,无非就是加些状态位
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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