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的压栈方式,很多局部变量都是高度优化定义。