stm32 cortext-M3 类型对齐问题【worldsing笔记】
2013-09-02 14:43
323 查看
经过细测,Cortex-M3的double类型必须4字节对齐访问,其他诸如float,int,short 可以非对齐访问。否则将会产生硬件异常!即访问double类型地址必须能被4整除,测试代码如下:
测试环境:
软件:windows xp + Keil Mdk4.7
硬件:stm32f103vb
代码:点击下载
在程序中使用double类型指针时,容易产生硬件异常,所以,double指针指向的地址最好是被4整除,但的多文件的代码中ROM分配是编译器会做优化,造成double指针指向的地址非4字节对齐。
如:
p = 0x20000000 + 33; 非4字节对齐,所以*p = 56.78;时会产生HardFault_Handler;
处理办法是:
1、用在Keil Mdk 中用,__attribute__((at(address))) 指定stm32 变量地址, 如char buf[56] __attribute__((at(0X20002000))) ; 指定buf在内存的地址为0X20002000;且是以4字节对齐;
2、在应用*p时对buf地址判断做偏移; 对多浪费3字节;
3、对链接脚本文件定位buf位置;
/* 测试Cortex-M3类型对齐访问
* i,j,k,l控制对齐长度,对齐
* 长度不符合是将产生HardFault
* 异常
*/
double *p;
float *q;
int *t;
short *r;
char buf[32] __attribute__((at(0X20002000)));
int main(void)
{
int i, j, k, l;
i = 0;
j = 0;
k = 0;
l = 0;
while(1)
{
p = (double *)(0x20000000 + i);
*p = 890.0;
i += 4; //double 地址增量,只能是4的整数倍
q = (float *)(0x20001000 + j);
*q = 890.0;
j += 1; //float 地址增量
t = (int *)(0x20002000 + k);
*t = 890;
k += 1; //int 地址增量
r = (short *)(0x20003000 + l);
*r = 890;
l += 1; //short 地址增量
}
return 0;
}
测试环境:
软件:windows xp + Keil Mdk4.7
硬件:stm32f103vb
代码:点击下载
在程序中使用double类型指针时,容易产生硬件异常,所以,double指针指向的地址最好是被4整除,但的多文件的代码中ROM分配是编译器会做优化,造成double指针指向的地址非4字节对齐。
如:
char tem[33];
char buf[65];
char ch;
double p;
p = (double *)buf;
p = 0x20000000 + 33; 非4字节对齐,所以*p = 56.78;时会产生HardFault_Handler;
处理办法是:
1、用在Keil Mdk 中用,__attribute__((at(address))) 指定stm32 变量地址, 如char buf[56] __attribute__((at(0X20002000))) ; 指定buf在内存的地址为0X20002000;且是以4字节对齐;
2、在应用*p时对buf地址判断做偏移; 对多浪费3字节;
3、对链接脚本文件定位buf位置;
相关文章推荐
- STM32 SysTick定时器应用【worldsing笔记】
- 关于stm32(cotex-m3)向量表初始化的总结笔记(含一个未解决问题)
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
- Keil uCos 2.52 stm32 【worldsing笔记】
- 更换STM32芯片类型引起keil下载Error Flash download failed-Cortex-M3问题的解决
- 如何使用Keil仿真环境查看CPU类型字长?【worldsing笔记】
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
- emWin5.24 VS2008模拟LCD12864 stm32 RTX移植 【worldsing笔记】
- stm32 时钟配置——外部时钟倍频、内部时钟倍频 【worldsing笔记】
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
- STM32学习笔记10——stm32中结构体字节对齐问题
- 射频识别技术漫谈(12)——三次相互认证【worldsing笔记】
- cortex_m3_stm32嵌入式学习笔记(十三):USMART调试组件移植(调试神器)
- cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)
- STM32 usart 问题笔记
- stm32笔记01——keil问题03.keil5安装
- Altium Designer导出部分元件过滤不焊接的元件【worldsing笔记】
- emWin显示文本字符-【worldsing笔记】
- Spring问题笔记(一):prototype类型bean的destroy-method问题
- Java基础篇笔记(二) ---容易忽视的表达式结果的类型,求概率、几率问题