标题: 51单片机双字节赋值问题 [打印本页]

作者: xsyyhz    时间: 2018-6-7 17:34
标题: 51单片机双字节赋值问题
本帖最后由 xsyyhz 于 2018-6-8 12:31 编辑

具体函数是这样的typedef struct
{
        void (*pTask)(void);
        INT16U delay_tick;
        INT16U period_tick;
        INT8U RunMe;
}SCHTask_Typedef;



void SCH_Update(void)
{
        INT8U Index;
        
        for (Index = 0; Index < SCH_MAX_TASKS; Index++)
        {
                if (SCH_tasks[Index].pTask)
                {
                        if (SCH_tasks[Index].delay_tick == 0)
                        {
                                SCH_tasks[Index].RunMe += 1;  // Inc. the 'Run Me' flag

                                if (SCH_tasks[Index].period_tick)
                                {
                                        SCH_tasks[Index].delay_tick = SCH_tasks[Index].period_tick;
                                }
                        }
                        else
                        {
                                SCH_tasks[Index].delay_tick -= 1;
                        }
                }         
        }
}

问题:
就是很简单的调度,period_tick = 1000(1s),LED任务应该 1s闪一次,实际结果闪的很快(具体实际不知,肯定小于1s)。
通过仿真模拟发现delay_tick 只获取了1000(0x03e8)的低字节即,delay_tick  = 0x00e8(232ms,与实际闪烁结果差不多)。
实验1:
在SCH_Update函数里建立局部变量 INT16U temp ,作为中间变量,赋值代码改为
temp  = SCH_tasks[Index].period_tick;
SCH_tasks[Index].delay_tick = temp ;
结果:仿真结果delay_tick  = 0x00e8,实际led闪烁也差不多
实验2:
在SCH_Update函数外建立全局变量 INT16U temp ,作为中间变量,赋值代码改为
temp  = SCH_tasks[Index].period_tick;
SCH_tasks[Index].delay_tick = temp ;
结果:仿真结果delay_tick  = 0x03e8,实际led闪烁1s一次

实验3:
直接给delay_tick  赋值 1000
SCH_tasks[Index].delay_tick = 1000;
结果:仿真结果delay_tick  = 0x03e8,实际led闪烁1s一次

请大神指点
作者: devcang    时间: 2018-6-7 21:21
上下文是怎样的,这样的一段看不到具体原因呢
作者: zhjb1    时间: 2018-6-7 22:14
结构体定义的delay_tick;和period_tick;都是16位的,赋值1000没有问题。而RunMe是8位的,赋值此变量时应该8位的。不知道您说的高位没有了是怎么看到的?而得出此结论?
作者: xsyyhz    时间: 2018-6-8 09:01
zhjb1 发表于 2018-6-7 22:14
结构体定义的delay_tick;和period_tick;都是16位的,赋值1000没有问题。而RunMe是8位的,赋值此变量时应该8 ...

具体函数是这样的typedef struct
{
        void (*pTask)(void);
        INT16U delay_tick;
        INT16U period_tick;
        INT8U RunMe;
}SCHTask_Typedef;



void SCH_Update(void)
{
        INT8U Index;
       
        for (Index = 0; Index < SCH_MAX_TASKS; Index++)
        {
                if (SCH_tasks[Index].pTask)
                {
                        if (SCH_tasks[Index].delay_tick == 0)
                        {
                                SCH_tasks[Index].RunMe += 1;  // Inc. the 'Run Me' flag

                                if (SCH_tasks[Index].period_tick)
                                {
                                        SCH_tasks[Index].delay_tick = SCH_tasks[Index].period_tick;
                                }
                        }
                        else
                        {
                                SCH_tasks[Index].delay_tick -= 1;
                        }
                }         
        }
}

问题:
就是很简单的调度,period_tick = 1000(1s),LED任务应该 1s闪一次,实际结果闪的很快(具体实际不知,肯定小于1s)。
通过仿真模拟发现delay_tick 只获取了1000(0x03e8)的低字节即,delay_tick  = 0x00e8(232ms,与实际闪烁结果差不多)。
实验1:
在SCH_Update函数里建立局部变量 INT16U temp ,作为中间变量,赋值代码改为
temp  = SCH_tasks[Index].period_tick;
SCH_tasks[Index].delay_tick = temp ;
结果:仿真结果delay_tick  = 0x00e8,实际led闪烁也差不多
实验2:
在SCH_Update函数外建立全局变量 INT16U temp ,作为中间变量,赋值代码改为
temp  = SCH_tasks[Index].period_tick;
SCH_tasks[Index].delay_tick = temp ;
结果:仿真结果delay_tick  = 0x03e8,实际led闪烁1s一次

实验3:
直接给delay_tick  赋值 1000
SCH_tasks[Index].delay_tick = 1000;
结果:仿真结果delay_tick  = 0x03e8,实际led闪烁1s一次





作者: wangzuolove    时间: 2018-6-8 09:30
学习了
作者: 爱学习的长得帅    时间: 2018-6-8 09:44
好这样的一段看不到具体原因呢
作者: 非常坤哥    时间: 2018-6-8 10:27
你还是先查下SCH_tasks[Index].period_tick本来等于多少吧,可能它本来就是0x00e8呢
作者: xsyyhz    时间: 2018-6-8 12:30
非常坤哥 发表于 2018-6-8 10:27
你还是先查下SCH_tasks.period_tick本来等于多少吧,可能它本来就是0x00e8呢

这个我已经仿真过了就是1000,并且我上面说了通过实验2全局变量做中间量就是可以的
作者: xsyyhz    时间: 2018-6-8 15:23
求大神解答
作者: lyjsongshan    时间: 2018-6-8 17:24
INT8U Index;-->>INT16U Index;
作者: xsyyhz    时间: 2018-6-9 09:09
lyjsongshan 发表于 2018-6-8 17:24
INT8U Index;-->>INT16U Index;

没看明白
作者: 黑富美    时间: 2018-6-9 09:54
就这一段,看不出来啊




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1