CMS51 单片机知识零散记录

1.多少T的理解

单片机中的多少T 是在读取FLASH需要加入多少个时钟等待,并不是机器周期和指令周期的对比。

所以在高主频下MCU内核是运行在高主频下的,指令也就是运行在高时钟模式下,只是读取速度会慢。

2.最近调试程序使用大量idata 变量后出现程序执行异常的现象。

首先回顾一些概念。MCS经典51内存一共又256个字节,低128字节可以使用直接访问。

高128字节只能使用间接访问,因为这高128为能被直接访问的已经被SFR特殊寄存器占用了。

这些特殊寄存器包含的是一些外设的配置寄存器,设计者估计是想让这些配置得到高效访问,所以把直接访问给了SFR。

在C51 中我们定义idata 是的变量可以间接访问。

data 定义的变量可以直接访问,速度也是最快的。但是只有128个。

xdata为外部内存,这个部分内存访问比较慢。

重点来了,当我定义的idata数量很多的时候 程序出现了运行异常情况。

调试发现 内存地址255都被覆盖,一看栈溢出了,按照道理编译器会给我计算栈的位置。

但是程序中出现了几个中断,中断也可能出现嵌套,编译器计算可能就疏漏了。

并且还有一个理解误区idata 这个变量不是从地址128字节开始定义的,低128字节也可以使用间接访问也就是idata来定义,编译器计算我们使用的data变量然后在后面就是我们定义的idata变量。

感觉这个C51 没有计算栈的空间,51进入中断会压栈,栈的方向是网上的,可能是C51 的函数如果不是定义为可重入不会使用标准C的压栈方式,很多局部变量都是高度优化定义。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值