找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2407|回复: 11
打印 上一主题 下一主题
收起左侧

51单片机双字节赋值问题

[复制链接]
跳转到指定楼层
楼主
ID:128176 发表于 2018-6-7 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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一次

请大神指点
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277550 发表于 2018-6-7 21:21 | 只看该作者
上下文是怎样的,这样的一段看不到具体原因呢
回复

使用道具 举报

板凳
ID:183218 发表于 2018-6-7 22:14 | 只看该作者
结构体定义的delay_tick;和period_tick;都是16位的,赋值1000没有问题。而RunMe是8位的,赋值此变量时应该8位的。不知道您说的高位没有了是怎么看到的?而得出此结论?
回复

使用道具 举报

地板
ID:128176 发表于 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一次




回复

使用道具 举报

5#
ID:347364 发表于 2018-6-8 09:30 | 只看该作者
学习了
回复

使用道具 举报

6#
ID:347386 发表于 2018-6-8 09:44 | 只看该作者
好这样的一段看不到具体原因呢
回复

使用道具 举报

7#
ID:186734 发表于 2018-6-8 10:27 | 只看该作者
你还是先查下SCH_tasks[Index].period_tick本来等于多少吧,可能它本来就是0x00e8呢
回复

使用道具 举报

8#
ID:128176 发表于 2018-6-8 12:30 | 只看该作者
非常坤哥 发表于 2018-6-8 10:27
你还是先查下SCH_tasks.period_tick本来等于多少吧,可能它本来就是0x00e8呢

这个我已经仿真过了就是1000,并且我上面说了通过实验2全局变量做中间量就是可以的
回复

使用道具 举报

9#
ID:128176 发表于 2018-6-8 15:23 | 只看该作者
求大神解答
回复

使用道具 举报

10#
ID:189835 发表于 2018-6-8 17:24 | 只看该作者
INT8U Index;-->>INT16U Index;
回复

使用道具 举报

11#
ID:128176 发表于 2018-6-9 09:09 | 只看该作者
lyjsongshan 发表于 2018-6-8 17:24
INT8U Index;-->>INT16U Index;

没看明白
回复

使用道具 举报

12#
ID:348011 发表于 2018-6-9 09:54 | 只看该作者
就这一段,看不出来啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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