stm32 cortext-M3 类型对齐问题【worldsing笔记】
经过细测,Cortex-M3的double类型必须4字节对齐访问,其他诸如float,int,short 可以非对齐访问。否则将会产生硬件异常!即访问double类型地址必须能被4整除,测试代码如下:
1: /* 测试Cortex-M3类型对齐访问
2: * i,j,k,l控制对齐长度,对齐
3: * 长度不符合是将产生HardFault
4: * 异常
5: */
6: double *p;
7: float *q;
8: int *t;
9: short *r;
10: char buf[32] __attribute__((at(0X20002000)));
11:
12: int main(void)
13: {
14: int i, j, k, l;
15: i = 0;
16: j = 0;
17: k = 0;
18: l = 0;
19: while(1)
20: {
21: p = (double *)(0x20000000 + i);
22: *p = 890.0;
23: i += 4; //double 地址增量,只能是4的整数倍
24:
25: q = (float *)(0x20001000 + j);
26: *q = 890.0;
27: j += 1; //float 地址增量
28:
29: t = (int *)(0x20002000 + k);
30: *t = 890;
31: k += 1; //int 地址增量
32:
33: r = (short *)(0x20003000 + l);
34: *r = 890;
35: l += 1; //short 地址增量
36:
37: }
38: return 0;
39:
40: }
41:
42:
43:
44:
测试环境:
软件:windows xp + Keil Mdk4.7
硬件:stm32f103vb
代码:点击下载
在程序中使用double类型指针时,容易产生硬件异常,所以,double指针指向的地址最好是被4整除,但的多文件的代码中ROM分配是编译器会做优化,造成double指针指向的地址非4字节对齐。
如:
1: char tem[33];
2:
3: char buf[65];
4:
5: char ch;
6:
7: double p;
8:
9: p = (double *)buf;
10:
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 cortext-M3 类型对齐问题【worldsing笔记】的更多相关文章
- stm32定时器时钟以及中间对齐模式
在永磁同步电机的控制中,需要对电机的三相定子施加一定的电压,才能控制电机转动.现在用的较多的是SVPWM(SVPWM的具体原理会在后面另写一篇博客说明),要想产生SVPWM波形,需要控制的三相电压呈如 ...
- Keil uCos 2.52 stm32 【worldsing笔记】
1.uCOSii V2.52 a.加了7个可以配置的钩子函数宏 #define OS_TASK_CREATE_HOOK_EN 0 /* 任务创建时调用钩子函数 使能 ...
- emWin5.24 VS2008模拟LCD12864 stm32 RTX移植 【worldsing笔记】
emWin for 12864 并口移植 源代码下载:RTX_emWin5.24_Keil_VS2008-20141122.zip 硬件环境: CPU: stm32f103ve LCD:st7 ...
- stm32 时钟配置——外部时钟倍频、内部时钟倍频 【worldsing笔记】
stm32可选的时钟源 在STM32中,可以用内部时钟,也可以用外部时钟,在要求进度高的应用场合最好用外部晶体震荡器,内部时钟存在一定的精度误差. 准确的来说有4个时钟源可以选分别是HSI.LSI.H ...
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() ...
- 74HC595 for STM32 源代码【worldsing笔记】
74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准. 74HC595是具有8位移位寄存器和一个存储器,三态输出功能. 移位寄存器和存储器是分别的时钟. 数据在SHcp(移 ...
- DS18B20 for STM32 源代码 【worldsing笔记】
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式:温度测量范围为-55℃-+125℃,可编程为9位-12位A/D转换精度,测温分辨率可达0.0625℃.主 ...
- 如何使用Keil仿真环境查看CPU类型字长?【worldsing笔记】
笔者上次写了如何用IAR查CPU的字长和数据类长度的方法:点击这里查看 今天试着在Keil MDK 5.0 里查看CPU的字长和数据类长度,打开一个已有的工程,编译并进入Debug,如图1.1所示: ...
- STM32 SysTick定时器应用【worldsing笔记】
SysTick是CM内核独立的定时器,时钟可以用内核内部的,也可以用芯片厂家(ST)的时钟,参考<Cortex-M3权威指南>的第13章: 另外也可以考<STM32F10xxx Co ...
随机推荐
- HeadFirst设计模式之RMI介绍
一.使用步骤 1.generate stubs and skeletons:Run rmic on the remote implementation class 如:D:\Workspaces\My ...
- Qt之高级网络操作(HTTP/FTP快速上手)Qt之QHttpPart和QHttpMultiPart
http://blog.csdn.net/u011012932/article/details/52535755 http://blog.csdn.net/u011012932/article/det ...
- Android工具:延展图片NinePatch
NinePatch能够对.png图片进行处理,生成一个.9.png格式的图片,图像拉伸操作时,图片就会有失真,而.9.png是Android里所支持的一种特殊的图片格式,可以实现部分拉伸. 制作图片方 ...
- MSSQLServer基础04(常用函数)
类型转换函数 CAST ( expression AS data_type) CONVERT ( data_type, expression,[style]) 对日期的转换.转换成各种国家格式的日期. ...
- 转:Build Your First JavaScript Library
http://net.tutsplus.com/tutorials/javascript-ajax/build-your-first-javascript-library/ Step 1: Creat ...
- 代理服务器squid
http://www.baidu.com/s?wd=squid%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8&f=12&rsp=0& ...
- createSQLQuery与createQuery的区别
本文原址 : http://stta04.javaeye.com/blog/377633hibernate 中createQuery与createSQLQuery 昨晚帮同事看代码到凌晨2点多,今早6 ...
- Can't obtain the input stream from /docProps/app.xml
今天在做poi修改样式时,报了以下错误: Exception in thread "main" org.apache.poi.POIXMLException: java.io.IO ...
- javascript中this的使用
终于知道某些大神在写js插件的时候为什么第一句都是"var that=this",来看看下面的这个例子,大家都会懂啦: <script type="text/jav ...
- HDU 5288 OO’s Sequence
题意:给一个序列,函数f(l, r)表示在[l, r]区间内有多少数字不是其他数字的倍数,求所有区间的f(l, r)之和. 解法:第一次打多校……心里还有点小激动……然而一道签到题做了俩点……呜呜呜… ...