硬汉嵌入式论坛

 找回密码
 立即注册
查看: 284|回复: 10
收起左侧

[技术讨论] keil(V9.61) c51平台数据比较大小怪事

[复制链接]

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2025-5-24 17:53:26 | 显示全部楼层 |阅读模式
本帖最后由 jxcrg_t35 于 2025-5-24 17:55 编辑

定义一个全局变量uint16_t sys_tick ,在10ms定时器内sys_tick ++,通过函数获取当前sys_tick计数
uint16 get_sys_tick(void)
{
   return sys_tick;
}

在主循环程序:
uintdata = get_sys_ticks();
uint16_t uintll               
while(1)
{
  uintll = get_sys_ticks();
  if((uintll - uintdata) >= 50u){uart0_dbg("\r\n[%u,%u]", uintdata, uintll); uintdata = uintll;}
}

现在软件仿真现象为
随机为获取到了sys_tick出现错误.如:
[0,50]
[50,100]
[100,150]
[150,200]
[200,250]
[250,0]
[0,256]

[256,306]
[306,356]

[1856,1906]
[1906,1956]
[1956,2006]
[2006,1792]

[1792,2049]
[2049,2099]

[3749,3799]
[3799,3584]
[3584,3841]

[3841,3891]


如果这样处理就不会.
if((uint8_t)(uintll - uintdata) >= 50u){uart0_dbg("\r\n[%u,%u]", uintdata, uintll); uintdata = uintll;}
请教各位



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-25 09:42:51 | 显示全部楼层
这个情况下,你要看下这个if里面(uintll - uintdata)结果是以什么数据类类型存在了。可以看下反汇编的处理
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-5-25 10:09:08 | 显示全部楼层
eric2013 发表于 2025-5-25 09:42
这个情况下,你要看下这个if里面(uintll - uintdata)结果是以什么数据类类型存在了。可以看下反汇编的处理

谢谢回复.这个和具体数据类型没关系吧.是获取到sys_tick的数字随机变化了.
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-25 14:10:03 | 显示全部楼层
jxcrg_t35 发表于 2025-5-25 10:09
谢谢回复.这个和具体数据类型没关系吧.是获取到sys_tick的数字随机变化了.

我理解错了,可以试试sys_tick变量定义加个__IO或者volatile,防止优化,保证每次都从源地址读数据

或者get函数前后做个开关中断
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-5-25 21:07:26 来自手机 | 显示全部楼层
51是8位机,执行get_sys_tick时进入中断了,sys_tick发生变化了,而且还发生了8位数据的进位
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-5-25 21:32:54 | 显示全部楼层
eric2013 发表于 2025-5-25 14:10
我理解错了,可以试试sys_tick变量定义加个__IO或者volatile,防止优化,保证每次都从源地址读数据

或 ...

谢谢回复 .
sys_tick已做了volatile定义.现解决的方法是在get_sys_tick()函数内做了关开中断.
个人理解为,在中断里只写,外部程序只读,觉得不存在资源同步问题.不知道理解对么
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-5-25 21:33:52 | 显示全部楼层
eric2013 发表于 2025-5-25 14:10
我理解错了,可以试试sys_tick变量定义加个__IO或者volatile,防止优化,保证每次都从源地址读数据

或 ...

再,外部程序单独读取sys_tick的值,不存在跳变的情况.
回复

使用道具 举报

69

主题

478

回帖

690

积分

金牌会员

积分
690
发表于 2025-5-25 22:17:53 | 显示全部楼层
你开的几级优化?关于 PY32 和 51 的问题也可以进我的 QQ 小群讨论:725436073
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2025-5-26 16:32:48 | 显示全部楼层
taobaofarmer 发表于 2025-5-25 22:17
你开的几级优化?关于 PY32 和 51 的问题也可以进我的 QQ 小群讨论:725436073

复位的那个问题,,搞清楚了么?
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2025-5-26 16:45:49 | 显示全部楼层
jxcrg_t35 发表于 2025-5-25 21:32
谢谢回复 .
sys_tick已做了volatile定义.现解决的方法是在get_sys_tick()函数内做了关开中断.
个人理解 ...

理解的并不对,,对于8位机来说,读取一个16位的数据要分两个指令,,如果再读一个字节的时候来了中断,并更新了另一个字节,那么回到主函数继续执行指令就会造成读取错误。所以必须保证读取16字节数据时必须保证这个过程的原子性。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-5-27 22:55:01 | 显示全部楼层
CofMilk 发表于 2025-5-26 16:45
理解的并不对,,对于8位机来说,读取一个16位的数据要分两个指令,,如果再读一个字节的时候来了中断, ...

谢谢,目前关开中断,解决了.
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 04:42 , Processed in 0.264769 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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