查看: 4828|回复: 10

对main函数调用子程序的框架感兴趣的 进来讨论一下

[复制链接]
  • TA的每日心情
    奋斗
    2023-9-15 06:28
  • 签到天数: 3747 天

    连续签到: 60 天

    [LV.Master]伴坛终老

    发表于 2013-1-16 08:55:15 | 显示全部楼层 |阅读模式
    分享到:
    主题:main函数调用子程序的框架
    子程序运行时间和调用时间要求: 子程序运行时间最少14us,最多20ms(比如浮点数算法子程序);子程序调用时间有的要求实时刷新(比如显示程序,端口扫描,ADC DAC 等要小于1ms),多数要求不严格(20ms-50ms 比如按键扫描等)
    请大家晒晒自个的代码结构是怎么样的呢?效率如何?

    我先自个说下我的代码结构吧,
    1,初始化定时器T0定时中断1ms(大部分mcu都有这个定时器的8位的就够用)
    2,T0中断中对t0timer++;
    3,main函数中对t0timer进行比较分支转到相对应的子程序执行,我一般用switch实现,
    以上结构在不太多的代码运行上还算顺畅的。
    但当需要调用的子程序过多的时候会增加运行调用的时间间隔.


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-7 21:35
  • 签到天数: 340 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-1-16 09:04:03 | 显示全部楼层
    分时调用……
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-1-16 12:27:03 | 显示全部楼层
    :):)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-15 06:28
  • 签到天数: 3747 天

    连续签到: 60 天

    [LV.Master]伴坛终老

    发表于 2013-1-17 08:16:23 | 显示全部楼层
    感谢大家的回复和关注,请尽量描述清楚框架,一句话远远不够哦!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-2-19 14:23:45 | 显示全部楼层
    我用的方法跟你也差不多:
    1. 除系统定时器计数t0timer外(实际上我用的是Systick,看名字就明白是怎么回事了),我为每个子功能(事件)分别创建对应的定时器变量func_tick及事件触发标志。
    2. 当要周期触发事件时,首先设定事件触发标志,并将当前的Systick值锁存到func_tick中,同时设定超时时间func_timeoff。
    3. 在主循环中,依次查看各事件的触发标志,若标记某事件已经触发,则使用IsTimeOut函数将该事件的func_tick+func_timeoff与系统当前的Systick相比较,判断是否超时,若返回TRUE(已超时),则执行相应子功能,否则,跳过查看其它事件。以此实现对事件的定时触发。
    4. 在我的框架中,主循环没事的时候就查看事件标志,若事件没被触发,则直接跳过;若事件已被触发,则查看超时状态,若未超时,也跳过;只有已经被触发并且超时的事件才能被响应。这是简单实现了操作系统的查询调度的思路,若对实时性有要求而自己又不想太费工夫,也可以直接拿个RTOS用,只要满足性能指标就可以。

    附件里是我写的一个样例工程,用一个tick_timer构件(tick_timer.h、tick_timer.c)实现对滴答定时器的操作。在主循环中调用滴答定时器,从而对事件进行周期控制。若是仅仅作为定时器,操作更简单。

    XX_KL25_SYSTICK.rar

    62.67 KB, 下载次数: 1

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-2-19 14:25:43 | 显示全部楼层
    另外,如果使用switch结构的话,好像就是有限状态机的实现思路了,这需要对系统的执行有个整体的考虑,如果系统不大的话,也是一个比较实用的结构。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-15 06:28
  • 签到天数: 3747 天

    连续签到: 60 天

    [LV.Master]伴坛终老

    发表于 2013-2-20 10:10:36 | 显示全部楼层
    suyong_yq 发表于 2013-2-19 14:23
    我用的方法跟你也差不多:
    1. 除系统定时器计数t0timer外(实际上我用的是Systick,看名字就明白是怎么回事 ...

    很赞同您的思路,不过,我在程序运行过程中,感觉个别子程序比如浮点数运算等,占用过多的时间,中间再发生串口收发中断等进程,在按键和显示方面就显得有时候会迟钝的现象出现,请教这方面您是怎么处理的呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-15 06:28
  • 签到天数: 3747 天

    连续签到: 60 天

    [LV.Master]伴坛终老

    发表于 2013-2-20 10:10:43 | 显示全部楼层
    suyong_yq 发表于 2013-2-19 14:23
    我用的方法跟你也差不多:
    1. 除系统定时器计数t0timer外(实际上我用的是Systick,看名字就明白是怎么回事 ...

    很赞同您的思路,不过,我在程序运行过程中,感觉个别子程序比如浮点数运算等,占用过多的时间,中间再发生串口收发中断等进程,在按键和显示方面就显得有时候会迟钝的现象出现,请教这方面您是怎么处理的呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-2-20 12:11:27 | 显示全部楼层
    dwwzl 发表于 2013-2-20 10:10
    很赞同您的思路,不过,我在程序运行过程中,感觉个别子程序比如浮点数运算等,占用过多的时间,中间再发 ...

    呵呵,其实我也是在学习,请教算不上,一起讨论吧。
    1. 如果编程功力深厚的话,串口收发是几乎不会占用主循环的事件的,将串口收发中断包含在驱动程序中,串口收发仅同收发缓冲区打交道,驱动功能调用也仅仅与收发缓冲区打交道,操作系统驱动就是这么做的,杜绝在驱动中查询等待。当然,如果有必要才这么做,如果是做演示程序,就不用这么折腾了。
    2. 按键的问题,不太好整,如果要求比较高,一般是再拿一个芯片专门做按键处理,就像PC机的键盘一样,把按键处理成一个设备模块,结合中断,不要在主循环中空等。按键主要考虑的是防抖动,所以用中断不合适,一般都是用查询+状态机的方式(不要用空等延时)。
    3. 显示的问题。如果是有显存的显示模块,可以仅在显示内容有变化的时才更新缓存。如果没有缓存,例如动态LED显示,可在编程时开设一个显存区,让定时器中断服务例程周期刷显存。
    4. 总之,写驱动的时候尽量少用空等延时,多结合中断,从而提高CPU(主循环)的工作效率。
    5. 置于实时性的问题,如果浮点数处理任务占用较多时间,可以将该任务分成若干个小任务,这样,在任务执行的间隙就可以响应实时操作了。如果用RTOS的话,浮点数处理任务的优先级是安排得很低的,减少对实时任务的影响。
    研究编程架构,有机会的话,搞一下RTOS的实现机制,很有帮助。
    PS:关于浮点运算,更NB的是使用专门的浮点运算处理器或模块,哈哈,爽到不得了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-15 06:28
  • 签到天数: 3747 天

    连续签到: 60 天

    [LV.Master]伴坛终老

    发表于 2013-2-21 08:47:10 | 显示全部楼层
    借鉴了,是得改变一下思路的,
    串口接收是不占时间,但是,我在接收后进行了及时的分检数据,看来还得改回完整接收后再分检;
    你对浮点数的处理很不错,我也刚刚找到一个把浮点数尽量改为整型计算或者查表计算的文章,还在看
    关于RTOS,底层太麻烦,还不是太稳定的个人认为!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 08:48 , Processed in 0.209284 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.