打印
[技术问答]

赛元单片机使用长整型变量的问题

[复制链接]
1689|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XXZDDZYX|  楼主 | 2019-1-6 18:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
gx_huang| | 2019-1-6 18:32 | 只看该作者
这有啥奇怪的,16bit和32bit的处理时间本来就不一样。

使用特权

评论回复
板凳
XXZDDZYX|  楼主 | 2019-1-6 19:04 | 只看该作者
gx_huang 发表于 2019-1-6 18:32
这有啥奇怪的,16bit和32bit的处理时间本来就不一样。

不止差一倍时间

使用特权

评论回复
地板
gx_huang| | 2019-1-6 19:16 | 只看该作者
XXZDDZYX 发表于 2019-1-6 19:04
不止差一倍时间

不止差一倍也很好理解呀,自己看看C的汇编代码就知道了,不同的C代码最终的汇编代码千差万别。

使用特权

评论回复
5
XXZDDZYX|  楼主 | 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;           //超时标志置位
             }
         }                                                       

使用特权

评论回复
6
mohanwei| | 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;
                }
        }
}

使用特权

评论回复
7
paotangsan| | 2019-1-25 13:15 | 只看该作者
是不是晶振不准的原因呢

使用特权

评论回复
8
wakayi| | 2019-1-25 14:04 | 只看该作者
那也不应该相差这么多才是啊

使用特权

评论回复
9
xiaoqizi| | 2019-1-25 18:20 | 只看该作者
个人感觉两方面的原因都有

使用特权

评论回复
10
XXZDDZYX|  楼主 | 2019-1-26 13:37 | 只看该作者
paotangsan 发表于 2019-1-25 13:15
是不是晶振不准的原因呢

使用内部RC振荡时钟

使用特权

评论回复
11
paotangsan| | 2019-2-1 15:53 | 只看该作者
XXZDDZYX 发表于 2019-1-26 13:37
使用内部RC振荡时钟

一般内部的都不是很准的

使用特权

评论回复
12
knk| | 2019-2-14 10:25 | 只看该作者
paotangsan 发表于 2019-1-25 13:15
是不是晶振不准的原因呢

内部晶振1%的误差。

使用特权

评论回复
13
paotangsan| | 2019-2-15 09:23 | 只看该作者
knk 发表于 2019-2-14 10:25
内部晶振1%的误差。

虽然是这个指标 但是往往会远远大于这个误差

使用特权

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

本版积分规则

4

主题

10

帖子

1

粉丝