打印
[经验分享]

提高单片机运行效率

[复制链接]
115|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rosemoore|  楼主 | 2023-9-28 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
保障时效性
       裸机系统中,在main函数里面while(1)一直在运行,使用延时函数会造成无效的等待时间,使单次while()循环执行延长,程序执行时间延长,时效性差。使用延时器的方法、中断定时执行。

精简代码
        C是面向过程编程,也要注重面向对象的思想编程,利用结构体、联合体、共同体的特性,将特性一直的变量一起结构化,函数实现过程也要注意拓展,接口使用结构体输入参量,将步骤一致的实验过程整合到一个函数里面,配合for、while实现循环使用,精简函数代码。

变量类型
         1、大小适合:使用合适的数据类型,避免造成内存的浪费,如0-255范围,可以定义成unsigned char ,也可以是unsigned int,但是内存使用大小不一样。

         2、符号类型:数据是否有负数,没有负数的数据就定义成unsigned。

宏定义
         一些经常使用的变量,不限类型,需要经常更改或者寄存器经常用到,还有一些简单的程序如,比较大小的三目程序都可以使用宏定义。

定义变量
      局部变量,全局变量,静态局部变量,静态全局变量的异同:

     (1)局部变量:在一个函数中或复合语句中定义的变量,在动态存储区分配存储单元,在调用时动态分配,在函数或复合语句结束时自动释放;

     (2)静态局部变量:在一个函数中定义局部变量时,若加上static声明,则此变量为静态局部变量,在静态存储区分配存储单元,在程序运行期间都不释放;静态局部变量只能在该函数中使用;静态局部变量在编译时赋值(若在定义时未进行赋值处理,则默认赋值为0(对数值型变量)或空字符(对字符型变量));静态局部变量在函数调用结束后不自动释放,保留函数调用结束后的值;

    (3)全局变量:在函数外定义的变量称为全局变量;全局变量在静态存储区分配存储单元,在程序运行期间都不释放,在文件中的函数均可调用该全局变量,其他文件内的函数调用全局变量,需加extern声明;

    (4)静态全局变量:在函数外定义变量时,若加上static声明,则此变量为静态全局变量;静态全局变量在静态存储区分配存储单元,在程序运行期间都不释放,静态全局变量在编译时赋值(若在定义时未进行赋值处理,则默认赋值为0(对数值型变量)或空字符(对字符型变量));只能在当前文件中使用。

     一般情况下就定义成局部变量,这样不仅运行更高效,而且很方便移植。局部变量大多定位于MCU内部的寄存器中,在绝大多数MCU中,使用寄存器操作速度比数据存储器快,指令也更多更灵活,有利于生成质量更高的代码,而且局部变量所的占用的寄存器和数据存储器在不同的模块中可以重复利用。当中断里需要用到的变量时,就需要定义成全局变量,并且加volatile修饰一下,防止编译器优化。如果数据是只读的比如数码管的断码、汉字取模的字库需要放在ROM里,这样可以节省RAM,51单片机是加code,高级点的单片机都是加const修饰。

       一般情况下,全局变量尽量不使用,影响整体程序的结构性,对于维护、二次开发影响较大。

条件编译
       使用条件编译,只有当条件满足时,才会进行编译。这样减少程序实际运行代码,优化代码,对于单片机的ROM、RAM负载减少,功率也降低。

C、汇编混合编译
      C和汇编汇编一般在Bootloader、或者UcosII、FreeRtos等等实时操作系统时常见,汇编操作内核寄存器,和C实现混编。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

1198

帖子

2

粉丝