[技术问答] 赛元单片机使用长整型变量的问题

[复制链接]
528|12
 楼主 | 2019-1-6 18:07 | 显示全部楼层 |阅读模式

typedef        unsigned int  uint;
typedef        unsigned long  ulong;

一个延时程序的变量,定义为ulong类型赋值60000延时不准,时间差很远;定义为uint类型赋值60000延时就准,不知为什么。
| 2019-1-6 18:32 | 显示全部楼层
这有啥奇怪的,16bit和32bit的处理时间本来就不一样。
 楼主 | 2019-1-6 19:04 | 显示全部楼层
gx_huang 发表于 2019-1-6 18:32
这有啥奇怪的,16bit和32bit的处理时间本来就不一样。

不止差一倍时间
| 2019-1-6 19:16 | 显示全部楼层
XXZDDZYX 发表于 2019-1-6 19:04
不止差一倍时间

不止差一倍也很好理解呀,自己看看C的汇编代码就知道了,不同的C代码最终的汇编代码千差万别。
 楼主 | 2019-1-6 19:55 | 显示全部楼层
gx_huang 发表于 2019-1-6 19:16
不止差一倍也很好理解呀,自己看看C的汇编代码就知道了,不同的C代码最终的汇编代码千差万别。 ...

同一个例程,中颖51就没见有这个问题, 同一个变量定义ulong和uint基本感觉不到误差。赛元的都不敢定义用ulong了。
typedef        unsigned  char        uchar;
typedef        unsigned  int      uint;
typedef        unsigned  long    ulong;
ulong   R_8min;

        if(B_2ms)  //用定时中断,2ms扫描一次
       {
             B_2ms=0;
              if(++R_8min>=60000) //水泵工作超时保护,计时2分钟
             {
                  R_8min=0;
                  P_WaterMotor=0;     //水泵停止
                  P_WaterValve=0;       //水阀断电          
                  B_MotorTimeOut=1;           //超时标志置位
             }
         }                                                       
| 2019-1-6 20:31 | 显示全部楼层
XXZDDZYX 发表于 2019-1-6 19:55
同一个例程,中颖51就没见有这个问题, 同一个变量定义ulong和uint基本感觉不到误差。赛元的都不敢定义用 ...

这不是好办法。不用处理速度最快的变量,2ms都不一定能把深层分支走完。

正常的8位机应该用单字节变量,定时中断应该是这样:
void timer_2ms_isr(void) interrupt xxx
{
        static u8 cnt_2ms=0;
        static u8 cnt_10ms=0;
        static u8 cnt_100ms=0;
        static u8 cnt_1s=0;
       
        F_2ms = 0;//供主程序使用的2ms标记
        cnt_2ms++;
        if(cnt_2ms>=5)
        {
                cnt_2ms=0
                F_10ms = 0;//供主程序使用的10ms标记
               
                cnt_10ms++;
                if(cnt_10ms>=10)
                {
                        cnt_10ms=0
                        F_100ms = 0;//供主程序使用的100ms标记
                       
                        cnt_100ms++;
                        if(cnt_100ms>=10)
                        {
                                cnt_100ms=0
                                F_1s = 0;//供主程序使用的1s标记
                        }
                }
        }
}

//主程序
void main(void)
{
......初始化

        while(1)
        {
                if(F_2ms)//供主程序使用的2ms标记
                {
                        func_2MS();//所有需要2ms处理一次的函数都放里面去
                        F_2ms = 0;
                }
               
                if(F_10ms)//供主程序使用的10ms标记
                {
                        func_10MS();//所有需要10ms处理一次的函数都放里面去
                        F_10ms = 0;
                }
               
                if(F_100ms)//供主程序使用的100ms标记
                {
                        func_100MS();//所有需要100ms处理一次的函数都放里面去
                        F_100ms = 0;
                }
               
                if(F_1s)//供主程序使用的1s标记
                {
                        func_1S();//所有需要1s处理一次的函数都放里面去
                        F_1s = 0;
                }
        }
}
| 2019-1-25 13:15 | 显示全部楼层
是不是晶振不准的原因呢
| 2019-1-25 14:04 | 显示全部楼层
那也不应该相差这么多才是啊
| 2019-1-25 18:20 | 显示全部楼层
个人感觉两方面的原因都有
 楼主 | 2019-1-26 13:37 | 显示全部楼层
paotangsan 发表于 2019-1-25 13:15
是不是晶振不准的原因呢

使用内部RC振荡时钟
| 2019-2-1 15:53 | 显示全部楼层
XXZDDZYX 发表于 2019-1-26 13:37
使用内部RC振荡时钟

一般内部的都不是很准的
| 2019-2-14 10:25 | 显示全部楼层
paotangsan 发表于 2019-1-25 13:15
是不是晶振不准的原因呢

内部晶振1%的误差。
| 2019-2-15 09:23 | 显示全部楼层
knk 发表于 2019-2-14 10:25
内部晶振1%的误差。

虽然是这个指标 但是往往会远远大于这个误差
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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