当前位置: 代码迷 >> 驱动开发 >> ARM汇编向存储器保存数据,该如何处理
  详细解决方案

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

热度:99   发布时间:2016-04-28 11:15:02.0
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字节对齐内存也无效
  相关解决方案