STC8G1K17-SOP8 2天排查出 例程中全局变量能不清零原因
因为这款STC8G1K17不带仿真功能找问题比较吃力!!找到原因后哭了{:titter:}很久没有接触51了,很多东西都忘记了。
问题描述:
之前的程序移植过来的。在STC库文件基础上修改并移值。
EEPROM读取出来的值被串口接收到的值覆盖、串口缓存上电就溢出。
以为是EEPROM程序扇区备份时造成溢出
以为是串口接收边界问题
以为是数据访问超出范围
问题解决
最后注释掉所有程序,仅留串口打印出全局变量 一上电,值不是0,而是一个随机值。打开STC的没被改过的库,定义了xdata的全局变量打印出来是随机值。
这时候我才想到启动文件!!! STARTUP.A51
为什么STC例程中没有启动文件呢??
看来要在初始化代码中,处理全局变量啊。 你们全局变量都不初始化的吗
你们全局变量都不初始化的吗 +1 ? stc如果有仿真,即使是ulink一半能力也可以,那么,国产化mcu趋势下,绝对的优势。大获全胜。 w600 发表于 2021-4-2 17:22
你们全局变量都不初始化的吗
一般51的汇编的启动代码里会初始化ram为0,平常定义的全局变量一般都没有初始化{:3_48:} sweet_136 发表于 2021-4-2 22:03
你们全局变量都不初始化的吗 +1 ?
全局变量会在启动文件里会被清零,以前一都没有初始化。以后大家引以为界 moment 发表于 2021-4-2 17:04
看来要在初始化代码中,处理全局变量啊。
添加STARTUP.A51启动文件会清RAM为0.要写好XDATA的大小 所以,不管怎么变量赋初值就没问题了 这算一个问题吗? vtte 发表于 2021-4-3 14:10
这算一个问题吗?
我的意思是如果用STC提供的例程,要么定义的全局变量初始化,要么自己加上启动文件。 你们全局变量都不初始化的吗?+1
还是要养成全局变量初始化的习惯,这样自己心里有底 huangmeilifan 发表于 2021-4-3 16:31
你们全局变量都不初始化的吗?+1
还是要养成全局变量初始化的习惯,这样自己心里有底 ...
是的 是的{:lol:}
没想到大家习惯都挺好的。我一直认为C定义全局变量默认值是0,就没在意过。而实际上它就应该为0
C语言标准C99中第8.7项初始化有说明:一个未显式的初始化的静态对象将被隐式的初始化,它(或它的成员)被赋予常量0,未显式初始化的自动对象的初始值是没有定义的。
C和指针这本书第44页同样写了这段话。
而这种初始化都会在main之前的代码中实现。
因此如果有和我一样平常习惯这种不初始化的朋友,请先查一下自己是否有清data的启动代码。否则还是养成初始化的习惯吧。
你们全局变量都不初始化的吗 +1 ?
任何变量只要定义了最好马上初始化,如果遇到指针,你不初始化,不管哪个平台都是定时炸弹。 全部变量都不给初值?
为了简便,我一般不用STARTUP文件,如果要清xdata,我用个指针,一个循环就解决了。
比如对于S8C8A8K系列的:
u8 xdata *p;
for(p=0; p<8192; p++)*p = 0; 因为这款STC8G1K17不带仿真功能找问题比较吃力!!找到原因后哭了
论:单片机有仿真器的重要性. 最后结论是这句话 {:loveliness:} 你们全局变量都不初始化的吗 +1 ?
用STM32的时候,不初始化,就会有警告。。玩51的时候,发现如果定义了xdata, 不初始化, 这个值会是随机的。。
养成良好编程习惯,不会错 STC单片机是有这样的问题,我也遇到过,所有现在不管用 什么单片机都给加了初始化。 现在这个芯片什么价格了?? 变量不初始化心里也不踏实呀 lb0857 发表于 2021-4-2 22:18
stc如果有仿真,即使是ulink一半能力也可以,那么,国产化mcu趋势下,绝对的优势。大获全胜。 ...
8051ELL库提高了STC硬件仿真的稳定性,可以参考一下
https://b23.tv/6kyR4H 全局变量不清0的,都是被Keil MDK惯坏了的吧,MDK全局变量不赋值,自动初始化为0. shuiluo2 发表于 2021-4-25 20:16
全局变量不清0的,都是被Keil MDK惯坏了的吧,MDK全局变量不赋值,自动初始化为0. ...
这不是编译器惯的,而是应该的。是C标准里有的 泽文i 发表于 2021-4-25 19:26
8051ELL库提高了STC硬件仿真的稳定性,可以参考一下
https://b23.tv/6kyR4H
8051ELL库花了不少精力在学校中能够做这样的事情是优质同学才有毅力和能力
不过不能让stc仿真 硬件仿真超越 stulink(官方广告词)
这条路还有很长的路要走
期待你今后去突破 lz。我最近也在攻坚 stc。stcsample code 写的太简单了。 是优点也是缺点。说多了都是泪。
lz 我给你个 思路吧。 我现在用的是 stc15 系列的 ,芯片默认是不带 仿真器的。 然后,我开发的时候 就用 8a8k 去 仿真调试程序。等程序 调试ok后 ,直接 hex 写到 stc15 上进心验证.
这里有几个技巧:
1.坚决 不用 或者 少用8a系列的 外设。
2.要把 8a只当作标准的 mcs-51 来对待 使用就好了。 也就是说 大部分比较高级的 外设 都用 软件io 去模拟。
3.idata 和 xdata都要 控制的比较好。 让 8a8k 实际使用的资源 小于15系列的 芯片。
-------------------------------------------------
如果 直接上15系列不带仿真器 的 ic 进心 烧录 调试。 项目简单 还有可能成功。 一般稍微复杂一点的项目, 各种怀疑到质疑人生。。
这是我最近几天的 感悟。 希望 大家能借鉴到
页:
[1]