经过细测,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笔记】的更多相关文章

  1. stm32定时器时钟以及中间对齐模式

    在永磁同步电机的控制中,需要对电机的三相定子施加一定的电压,才能控制电机转动.现在用的较多的是SVPWM(SVPWM的具体原理会在后面另写一篇博客说明),要想产生SVPWM波形,需要控制的三相电压呈如 ...

  2. Keil uCos 2.52 stm32 【worldsing笔记】

    1.uCOSii V2.52    a.加了7个可以配置的钩子函数宏     #define OS_TASK_CREATE_HOOK_EN    0    /* 任务创建时调用钩子函数      使能 ...

  3. emWin5.24 VS2008模拟LCD12864 stm32 RTX移植 【worldsing笔记】

      emWin for 12864 并口移植 源代码下载:RTX_emWin5.24_Keil_VS2008-20141122.zip   硬件环境: CPU: stm32f103ve LCD:st7 ...

  4. stm32 时钟配置——外部时钟倍频、内部时钟倍频 【worldsing笔记】

    stm32可选的时钟源 在STM32中,可以用内部时钟,也可以用外部时钟,在要求进度高的应用场合最好用外部晶体震荡器,内部时钟存在一定的精度误差. 准确的来说有4个时钟源可以选分别是HSI.LSI.H ...

  5. stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的.   那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘:     刚接手STM32时,你只编写一个 int main() ...

  6. 74HC595 for STM32 源代码【worldsing笔记】

    74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准. 74HC595是具有8位移位寄存器和一个存储器,三态输出功能. 移位寄存器和存储器是分别的时钟. 数据在SHcp(移 ...

  7. DS18B20 for STM32 源代码 【worldsing笔记】

    DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式:温度测量范围为-55℃-+125℃,可编程为9位-12位A/D转换精度,测温分辨率可达0.0625℃.主 ...

  8. 如何使用Keil仿真环境查看CPU类型字长?【worldsing笔记】

    笔者上次写了如何用IAR查CPU的字长和数据类长度的方法:点击这里查看 今天试着在Keil MDK 5.0 里查看CPU的字长和数据类长度,打开一个已有的工程,编译并进入Debug,如图1.1所示: ...

  9. STM32 SysTick定时器应用【worldsing笔记】

    SysTick是CM内核独立的定时器,时钟可以用内核内部的,也可以用芯片厂家(ST)的时钟,参考<Cortex-M3权威指南>的第13章: 另外也可以考<STM32F10xxx Co ...

随机推荐

  1. 给TextView中的text上下左右添加一张图片

    1,在xml中配置使用,android:drawableLeft 等 其它的有:android:drawableTop,android:drawableBottom,android:drawableR ...

  2. 【HDOJ】4347 The Closest M Points

    居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...

  3. poj 1924 Paths on a Grid(组合数学)

    题目:http://poj.org/problem?id=1942 题意:给定一个矩形网格的长m和高n,其中m和n都是unsigned int32类型,一格代表一个单位,就是一步,求从左下角到右上角有 ...

  4. c++ 头文件 及 sort

    c++  sort :http://www.16kan.com/post/997260.html http://wenku.baidu.com/view/e064166daf1ffc4ffe47ac6 ...

  5. [ZOJ 2836] Number Puzzle

    Number Puzzle Time Limit: 2 Seconds      Memory Limit: 65536 KB Given a list of integers (A1, A2, .. ...

  6. java.sql.DataTruncation: Data truncation

    问题一: 用jdbc插入数据时,当数据库表中某列设置的长度小于要插入的字符的实际长度时就会抛出此异常. 如:数据表中某列char [4],长度为4,插入:"Hello"时,字符&q ...

  7. Bootstrap 源码解析(转)

    1.Bootstrap的作用域 2.Bootstrap的类定义 3.Bootstrap的插件定义 4.Bootstrap的事件代理 5.Bootstrap的对象数据缓存 6.Bootstrap的防冲突 ...

  8. Robotium 系列(2) - 简单介绍Monkey和MonkeyRunner

    除了Robotium,Android还有其他的自动化测试方法,比如Monkey和MonkeyRunner. 这里就做一个简单的介绍和使用方法. 本文提纲: 1. Android SDK以及SDK中的工 ...

  9. Linux下复制粘贴快捷键

    1. 在控制台下:            1.1.鼠标选中要复制的文本,按鼠标中键,即为复制                              或者              1.2.复制命令 ...

  10. uva 12296 Pieces and Discs

    题意: 有个矩形,左下角(0,0),左上角(L,W). 思路: 除了圆盘之外,本题的输入也是个PSLG,因此可以按照前面叙述的算法求出各个区域:只需把线段视为直线,用切割凸多边形的方法 :每次读入线段 ...