首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

ARM汇编向存储器保存数据,该如何处理

2012-03-01 
ARM汇编向存储器保存数据程序实现对DCD申请的一片数组内的数据进行冒泡排序但是在程序内循环截止向存储保

ARM汇编向存储器保存数据
程序实现对DCD申请的一片数组内的数据进行冒泡排序
但是在程序内循环截止向存储保存数据时出现了差错
首地址的数值一直不能被保存住,也就是说单步时能看见它的变化,但是在执行下一行时就不行了,数据又变回来了!

Assembly code
 ;冒泡排序法实现N EQU 10            AREA EX4_47,CODE,READONLY            ENTRY            CODE32START       LDR R0,=BUF                ;数组首地址赋予R0            MOV R1,#0                  ;外循环计数器            MOV R2,#0                  ;内循环计数器LOOPO       ADD R3,R0,R1,LSL #2        ;外循环首地址R3            MOV R4,R3                  ;内循环首地址R4            ADD R2,R1,#1               ;修改内循环计数器            MOV R5,R4                  ;内循环下一地址初值            LDR R6,[R4]                ;内循环第一个值放入R6LOOPI       ADD R5,R5,#4               ;内循环下一地址            LDR R7,[R5]                ;内循环下一个值R7            CMP R6,R7            BLT NEXT                   ;小于则内循环下一轮开始            SWP R7,R6,[R5]             ; >=就交换            MOV R6,R7NEXT        ADD R2,R2,#1               ;修改内循环计数器            CMP R2,#N                  ;判断内循环退出与否            BLT LOOPI            SWP R7,R6,[R3]             ;将最小数出入外循环的首地址            ADD R1,R1,#1               ;外循环计数器修改             CMP R1,#N-1                ;外循环退出判断            BLT LOOPO            B START            AREA BlockData,DATA,READWRITEBUF         DCD 0XFF,0X00,0X40,0X10,0X90,0X20,0X80,0X30,0X50,0X70            END

执行SWP R7,R6,[R3]前

执行SWP R7,R6,[R3]后下一句之前

执行下一句后

最终结果


[解决办法]
你要修改的地址好像是flash的,不是ram的,能改掉才怪

[解决办法]
探讨
你要修改的地址好像是flash的,不是ram的,能改掉才怪


[解决办法]
可能是CACHE导致的假改变. 你的是处理器可能是44B0,你的写操作缓存在CACHE里面,写后立即去读,好像是正确改变了,但实际上它的EMI只会发出RAM写,不会改变FLASH-ROM. 下次再访问又不对了.
[解决办法]
Assembly code
 ;冒泡排序法实现N EQU 10            AREA EX4_47,CODE,READONLY            ENTRY            CODE32START       LDR R0,=BUF                ;数组首地址赋予R0            MOV R1,#0                  ;外循环计数器            MOV R2,#0                  ;内循环计数器LOOPO       ADD R3,R0,R1,LSL #2        ;外循环首地址R3            MOV R4,R3                  ;内循环首地址R4            ADD R2,R1,#1               ;修改内循环计数器            MOV R5,R4                  ;内循环下一地址初值            LDR R6,[R4]                ;内循环第一个值放入R6LOOPI       ADD R5,R5,#4               ;内循环下一地址            LDR R7,[R5]                ;内循环下一个值R7            CMP R6,R7            BLT NEXT                   ;小于则内循环下一轮开始            SWP R7,R6,[R5]             ; >=就交换            MOV R6,R7NEXT        ADD R2,R2,#1               ;修改内循环计数器            CMP R2,#N                  ;判断内循环退出与否            BLT LOOPI            SWP R7,R6,[R3]             ;将最小数出入外循环的首地址            ADD R1,R1,#1               ;外循环计数器修改             CMP R1,#N-1                ;外循环退出判断            BLT LOOPO            B START            AREA BlockData,DATA,READWRITE,align=4BUF         DCD 0XFF,0X00,0X40,0X10,0X90,0X20,0X80,0X30,0X50,0X70            END
[解决办法]
检查一下CP控制寄存器的Align开关是否打开,如果打开,LDR/STR指令操作非4字节对齐内存无效,同样LDRH/STRH操作非2字节对齐内存也无效

热点排行