硬汉嵌入式论坛

 找回密码
 立即注册
查看: 869|回复: 6
收起左侧

[有问必答] 系统任务中有耗时的while(1)等待 怎么优化?

[复制链接]

4

主题

8

回帖

20

积分

新手上路

积分
20
发表于 2022-7-14 11:26:28 | 显示全部楼层 |阅读模式
微信图片_20220714112015.png 微信图片_20220714112023.png 任务app_led3  中执行  MODH2_ReadParam_03H_addr(1,0x06, 1);   
  MODH2_ReadParam_03H_addr(1,0x06, 1)中有等待数据返回的while (1)                {
                        bsp_Idle_2();

                        if (bsp_CheckRunTime(time1) > TIMEOUT)               
                        {
                                break;                /* í¨DÅ3¬ê±áË */
                        }

                        if (g_tModH2.fAck03H > 0)
                        {
                                break;
                        }
                }
这个while(1)很耗时间  只有大于timeout才能退出,怎么优化?



回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2022-7-14 15:18:52 | 显示全部楼层
既然已经上OS了,建议采用事件触发方式。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

78

主题

693

回帖

927

积分

金牌会员

积分
927
发表于 2022-7-14 16:46:55 | 显示全部楼层
做一个check函数,检测到timeout或者其他退出条件返回1,接着往下运行。否则返回0直接return。这个函数轮询
回复

使用道具 举报

3

主题

338

回帖

347

积分

高级会员

积分
347
发表于 2022-7-14 17:33:01 | 显示全部楼层
改用状态机实现
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2022-7-14 17:53:15 | 显示全部楼层
uint8_t MODH2_ReadParam_03H_addr(uint8_t addr,uint16_t _reg, uint16_t _num)
{
        int32_t time1;
        uint8_t i;
        SlaveAddr_2 = addr;
        for (i = 0; i < NUM; i++)
        {
                MODH2_Send03H (SlaveAddr_2, _reg, _num);
                time1 = bsp_GetRunTime();        /* &#188;&#199;&#194;&#188;&#195;üá&#238;·¢&#203;íμ&#196;ê±&#191;ì */
               
                while (1)
                {
                        bsp_Idle_2();

                        if (bsp_CheckRunTime(time1) > TIMEOUT)               
                        {
                                break;                /* í¨D&#197;3&#172;ê±á&#203; */
                        }
                       
                        if (g_tModH2.fAck03H > 0)
                        {
                                break;
                        }
                }
               
                if (g_tModH2.fAck03H > 0)
                {
                        break;
                }
        }
       
        if (g_tModH2.fAck03H == 0)
        {
                return 0;        /* í¨D&#197;3&#172;ê±á&#203; */
        }
        else
        {
                return 1;        /* D′è&#235;03H2&#206;êy3é1| */
        }
}

完整的函数是这样子的  
1.采用事件触发方式,不触发时正常扫描, 触发后还是会在超时时间内等待
2.如果做一个标志,在任务中不断判断超时时间到,程序向下执行会直接返回超时,还有就是循环等待过程中MODH2_ReadParam_03H_addr(1,0x06, 1)一直发送,而不是现在的发送一次等待接收完成后在发送
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2022-7-20 22:30:26 | 显示全部楼层
不是上了操作系统吗?只要代码中有释放cpu的操作(最常见的os_sleep()之类的),当有更紧急的任务要处理时,系统会自动调度的(前提是任务优先级设置得当)
回复

使用道具 举报

5

主题

65

回帖

80

积分

初级会员

积分
80
发表于 2022-9-1 15:43:23 | 显示全部楼层
用软件定时器或硬件定时器定时给状态值,通过状态值来具体操作
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 08:35 , Processed in 0.285844 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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