STC32G144K246 用户手册
https://www.stcaimcu.com/data/do ... t/STC32G144K246.pdf
51, RAM中运行程序@120MHz, STC32G144K246 | 从QSPI直接运行程序开发中
本例程使用内部24MHz高速时钟,经过HPLL1倍频到120MHz后,给系统时钟使用
另有实际测试:同样的一段计算函数(1000次整数乘法和加法),计算时关闭总中断
主程序120MHz消耗了200us,
而在RAM内运行消耗了124us(此时变量被设置到了edata区域,相比主程序的xdata区域存取快),速度提高了38%
补充:这个差距经查,并非是由RAM和FLASH运行速度差距导致的,而是由于内存模式的设置导致的(WTST在FLASH运行和RAM都可设置)
这里得到一个结论:如果需要使用循环大量计算时,且对时间较为敏感的实时性需求,建议定义变量到edata区域
程序拥有两种方式来载入RAM程序,一种是同一个工程中,通过对函数取地址来获取程序内容。这种方法在调用其他函数的时候,本质还是会跳转回到FLASH部分运行
第二种是使用独立的工程来编译RAM中需要运行的程序,这部分通过设置程序整体偏移地址为0x800000实现,同时通过hex2bin.exe实现自动转为bin文件,这个编译后的bin文件通过“打开EEPROM文件”载入即可使用
使用同一工程的方式,效果是P32和P35闪烁,长按P32按键后,P32、P35停止闪烁。这部分程序是主程序,非RAM内运行
如果按下P33按键,则跳转到RAM内运行程序,效果是P6上持续自减数值,也就是二进制不断刷新显示。
使用不同工程的方式,主程序运行效果和上面所述一致
但是如果按下P33按键,程序跳转到RAM内运行程序,效果是P60持续闪烁
需要注意的是,使用不同工程的情况下,需要手动设定ECALL跳转地址
具体操作为打开独立的RAM_EXE工程:
选择模拟仿真后点击仿真按钮
然后查看main函数内第一行的语句所在地址:这里是0x80:000f,将这个地址回填到主程序内的绝对地址跳转调用上即可
注意事项:
在CKCON的最高位bit7中RAMEXE中
如果RAMEXE设置为0时,可以通过03:0000H~03:0FFFH的far地址读写,此时可以认为是拓展的xdata地址
这个时候不可以读800000H~800FFFH,否则会造成错误,进而导致卡死(因为800000H~800FFFH属于ecode,本来也不让写)
如果RAMEXE设置为1时,可以通过80:0000H~80:0FFFH地址来读内容
这个时候写03:0000H~03:0FFFH,写入内容不会生效,读取内容也和实际内容不符(作为保护程序的一个措施,如果需要更改程序,需要将RAMEXE重新设置为0)
简单科普:
far类型是用来定义变量/常量的,
不同于xdata这种自带偏移的地址(char xdata a _at_ 0;的实际地址是01:0000H)
far类型类似一种绝对地址,是从00:0000H开始的,覆盖edata和xdata部分
以下为keil 帮助文档的解释:
far
远存类型可用于变量和常量。此内存使用24位地址访问,可以是片上或外部的。
对于变量,远存内存限制为16M。对象限制为64K,并且不能跨越64K边界(链接器确保这一点)。声明为far的变量位于HDATA内存类别中。
对于常量(ROM变量),远区内存被限制为16M。对象被限制为64K,且不能跨越64K的边界(链接器会确保这一点)。声明为远区的常量变量位于HCONST组中。
以下是程序下载链接:
STC32G144K246-RAM运行程序测试.zip
(182.38 KB, 下载次数: 8)
以下是程序内容:
复制代码
|