如何选择内部扩展ram和外部扩展ram

如何选择内部扩展ram和外部扩展ram,第1张

内部ram:就是你存放数据的地方,你平时自己定义的变量的地址就是内部RAM

外部ram:相当于扩展的存放数据区,由于内部ram太小,有时候装不下我们要存放的数据,因此增加了外部RAM,它其实和内部RAM的功能一样,唯一的区别就是取值的方式不同

程序存储器:存放程序的空间,你所写的程序编译后的机器码都在那个空间,我们执行程序的时候也是在那里实现,程序存储器也可以存放数据

数据存储器:就是内部ram和外部ram

mov,movx两个指令的区别就是一个取内部RAM空间的值而movx取外部ram空间的值

论坛上看到的比较。\x0d\这几天刚拿到STM32F4的评估板,STM32F4这次的卖点就是FPU和DSP指令集,关注了挺长时间,这次就想测试一下STM32F4的浮点性能,如果满足就升级自己飞控的架构。本来用STM32F103+28335双核架构,F28335当浮点处理器用,调试起来比较麻烦,所以一直想换了。\x0d\\x0d\测试代码就是用的我飞控的算法,全部使用浮点运算,包含姿态和位置两个7阶和9阶的卡尔曼滤波器,包含大量的矩阵运算以及部分导航算法和PID控制器等,还有部分IF和SWITCH包含跳转的判定语句,相比纯算法算是一个比较综合的运算。\x0d\\x0d\测试环境:\x0d\F28335:CCS V33,使用TI优化的数学库,不开优化,程序在RAM里执行。\x0d\STM32F4:KEIL V47,使用ARM优化的数学库,不开优化。\x0d\\x0d\测试方法:\x0d\F28335:在飞控算法入口设置断点,清零CCS的CPU计数器(profile->clock),然后STEP OVER,记录下CPU的计数\x0d\STM32F4:在飞控算法入口设置断点,记录下Register窗口内算states计数器,然后STEP OVER,记录下新的计数器数值,与之前的数值相减得到CPU计数\x0d\\x0d\测试结果:\x0d\F28335:253359个CPU周期,除以150MHZ,大约是169ms\x0d\STM32F4:一共285964个周期,除以168MHZ,大约是17ms,比F28335略慢\x0d\\x0d\结论就是,对于包含相对较多跳转的综合浮点算法而言,STM32F4似乎并不慢多少。\x0d\\x0d\抛开架构因素,从纯浮点运算方面来看的话。STM32F4的FPU加减乘指令VADDF32、VSUBF32、VMULF32都是单周期指令,而除法VDIVF32耗费14个周期。\x0d\例如:a = a / b;产生的汇编为:\x0d\0x08000220 ED900A00 VLDR s0,[r0,#0x00]\x0d\\x0d\0x08000224 4804 LDR r0,[pc,#16] ; @0x08000238\x0d\\x0d\0x08000226 EDD00A00 VLDR s1,[r0,#0x00]\x0d\\x0d\0x0800022A EE801A20 VDIVF32 s2,s0,s1\x0d\\x0d\0x0800022E 4803 LDR r0,[pc,#12] ; @0x0800023C\x0d\\x0d\0x08000230 ED801A00 VSTR s2,[r0,#0x00]\x0d\复制代码 F28335: F28335的FPU有加减乘法指令,都是双周期的,由于没有硬件除法指令,F28335这里是用软件模拟的浮点除法,汇编可以看到 LCR $div_f32asm字样,需要19个时钟周期。\x0d\例如:a = a b,产生的汇编为:\x0d\0087B2 E203 MOV32 -SP[4], R0H\x0d\\x0d\0087B4 E2AF MOV32 R1H, -SP[6], UNCF\x0d\\x0d\0087B6 E700 MPYF32 R0H, R1H, R0H\x0d\\x0d\0087B8 7700 NOP //需要让流水线等待FPU运算完毕,所以需要NOP \x0d\\x0d\0087B9 E203 MOV32 -SP[4], R0H\x0d\\x0d\复制代码 除法:\x0d\0087BD E203 MOV32 -SP[4], R0H\x0d\\x0d\0087BF E2AF MOV32 R1H, -SP[6], UNCF\x0d\\x0d\0087C1 7640 LCR $div_f32asm:52:71$\x0d\\x0d\0087C3 E203 MOV32 -SP[4], R0H\x0d\复制代码 结论:\x0d\可见单从浮点处理器来说,F28335是不如F4的FPU的。但是由于F28335是哈佛架构,有较长的流水线,可以在一个时钟周期里完成读取,运算和存储,所以程序连续运行的话,就比ARM快上许多许多,比如执行一次a = a + b只需要5个时钟周期,但是缺点就是一旦要跳转,就必须清空流水线,如果是\x0d\for(i = 0;i 回答于 2022-11-17

单片机使用外部RAM使用MOVX指令,比如

MOV DPTR,#1000H

MOVX A,@DPTR

MOVX @DPTR,A

MOV R0,#20H

MOVX @R0,A

MOVX A,@R0

  这样的问题确实挺让人头痛的,往往这种情况还不报错,非常让人郁闷。28335我没用过。如果你用的是2812我能立即给你解决了。28335的话,我给你说一下我调试的经验吧。

  1看看编译的时候有没有错误。如果有错的话,对应的去网上搜一下,往往都能找到一些方法。

  2跑个例程看看,如果例程都不能跑通的话。先查查硬件有没有问题。

  3例程跑通之后,将你的程序改小,然后将程序刷进去看看。一般就是按例程那样先一个模块一个模块的跑。如果加上某个模块不工作了,你看看有没有明显错误。如果没有,单独跑一下这个模块。如果单独可以跑的话。很有可能是cmd段分配和ccs设置的问题了。你可以试试在项目中右击,选择Properties(Alt+Enter),在如下图所示的选项卡中选择Optimization level,将其设置为off即不优化。

  4下载进去之后,再在线调一下。在main开始处打个断点试试。如果程序是跑飞的进不了main以2812为例,我建议你检查一下你的Boot ROM是不是选择的从内部启动。2812上有个引脚MP/MC(微处理器模式/微计算机模式),如果这个引脚为0说明被设置为从内部boot启动,你看一下28335有没有类似的引脚,建议你出现ram中能运行,flash中不能运行的问题时,首先检查这引脚的状态。

  5检查你的flash cmd文件,建议你先从Debug文件夹下的map文件看起。map文件是十分用于的。它包含了你编译出的所有段和定义的所有段的所有信息,包括段的起始地址、长度、使用长度和未使用长度。包括编译生成的test、cinint等段的信息,如果你发现某个段定义了但没有使用,很有可能是因为你这个段长度太小了,它放不进去就不放了。你了解一下cmd的编写对应看map文件改改看。

ps:我的版本是ccs55,工程项目以在ccs33下创建的为例。map文件部分截图如下:

@DPTR,就是指向外部RAM的,A是在单片机内部的,源数据在@DPTR,就是在外部RAM,目的数据在内部A,从外部传送到内部A,就像是读书一样,从书上读到文字到大脑里。所以,称读外部RAM。

反过来,MOVX @DPTR,A,是由内部传到外部RAM,就像你写字一样,从大脑到手写到纸上,所以,称为写外部RAM。

这读/写都是比较形象地表达了数据的传送过程。

以上就是关于如何选择内部扩展ram和外部扩展ram全部的内容,包括:如何选择内部扩展ram和外部扩展ram、stm32f407和tms320f28335的区别是什么、单片机使用外部RAM怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10171196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存