打印

【STM32】这段代码执行起来会不会出错?

[复制链接]
3624|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
inurl|  楼主 | 2013-1-5 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 inurl 于 2013-1-6 09:44 编辑

        int i = 0 ;
        __packed int *addr1 = (__packed int *)((u8 *)&i + 1) ;
        int *addr2 =  (int *)((u8 *)&i + 1);                                 
        int *addr3 =  (int *)((u8 *)&i + 2);
        int *addr4 =  (int *)((u8 *)&i + 3);
        *addr1 = 19;
        *addr2 = 19;                 
        *addr3 = 19;
        *addr4 = 19;


       struct __STT{
       u8 a;
       __packed int b;
       u8 c;
       }ST;
       ST.b = 19;


STM32或者ARM7或者ARM9







相关帖子

沙发
ymind| | 2013-1-5 13:17 | 只看该作者
arm7,arm9不支持地址不对齐访问。但如果运行在操作系统里,操作系统可通过exception handler fixup it。
stm32的cortex-m0, m3支持地址不对齐访问,不过需要使能这个feature,具体在CP15 某个寄存器里(有错轻拍)。

使用特权

评论回复
板凳
airwill| | 2013-1-5 14:01 | 只看该作者
stm32的cortex-m3支持地址不对齐访问,
cortex-m0 同样不支持

使用特权

评论回复
地板
xinzha| | 2013-1-5 15:35 | 只看该作者
arm7和9是直接不支持的,arm11可以支持可以不支持,通过cp15配置,m3支持但不建议。

使用特权

评论回复
5
inurl|  楼主 | 2013-1-5 16:39 | 只看该作者
airwill 发表于 2013-1-5 14:01
stm32的cortex-m3支持地址不对齐访问,
cortex-m0 同样不支持

soga  ,看来这段代码完全没有可移植性

使用特权

评论回复
6
airwill| | 2013-1-5 16:44 | 只看该作者
inurl 发表于 2013-1-5 16:39
soga  ,看来这段代码完全没有可移植性

是的, 还是别折腾自己了.

使用特权

评论回复
7
inurl|  楼主 | 2013-1-5 17:08 | 只看该作者
ymind 发表于 2013-1-5 13:17
arm7,arm9不支持地址不对齐访问。但如果运行在操作系统里,操作系统可通过exception handler fixup it。
st ...

有没有这方面的资料可以看看?

使用特权

评论回复
8
inurl|  楼主 | 2013-1-5 17:09 | 只看该作者
airwill 发表于 2013-1-5 16:44
是的, 还是别折腾自己了.


有没有这方面的资料可以看看?

使用特权

评论回复
9
inurl|  楼主 | 2013-1-5 17:09 | 只看该作者
xinzha 发表于 2013-1-5 15:35
arm7和9是直接不支持的,arm11可以支持可以不支持,通过cp15配置,m3支持但不建议。
...


有没有这方面的资料可以看看?

使用特权

评论回复
10
inurl|  楼主 | 2013-1-5 17:13 | 只看该作者
airwill 发表于 2013-1-5 16:44
是的, 还是别折腾自己了.

问这个问题的原因是不支持内存不对齐访问的话, 结构体里面必须要4字节对齐(有int类型), 这样有时候会很麻烦。

使用特权

评论回复
11
airwill| | 2013-1-5 17:25 | 只看该作者
inurl 发表于 2013-1-5 17:09
有没有这方面的资料可以看看?

要去 ARM 公司, 找内核的资料.

使用特权

评论回复
12
xinzha| | 2013-1-5 20:41 | 只看该作者
arm现在有中文网站了,去上面找《architecture reference manual》,针对不同版本架构有不一样的手册。

使用特权

评论回复
13
ymind| | 2013-1-6 08:48 | 只看该作者
inurl 发表于 2013-1-5 17:08
有没有这方面的资料可以看看?

<ARM Architecture Reference>,不过要看ARMv6及其以后的。
关于操作系统模拟不对齐数据访问的指令,原理类似于定点处理器模拟执行浮点指令一样。一般RISC机器的实现为了效率,都不实现不对齐数据访问,包括Sparc和PPC4xx.
至于有些协议定义了不对齐的数据域,为了代码移植方便,好的实现对这种情况都是拆分字节访问,再拼装的。有的体系结构的有些编译器,距我所知如IAR for MPS430,自动支持拆分访问。

使用特权

评论回复
14
inurl|  楼主 | 2013-1-21 10:50 | 只看该作者
本帖最后由 inurl 于 2013-1-23 20:31 编辑
ymind 发表于 2013-1-5 13:17
arm7,arm9不支持地址不对齐访问。但如果运行在操作系统里,操作系统可通过exception handler fixup it。
st ...

再回来翻这个帖子, 你说的地方有些也是不对的。
1、“如果运行在操作系统里,操作系统可通过exception handler fixup it” ,不是操作系统啦, 只是CPU支持的一个HardFaultException啦。
2、另外,如果CPU不支持不对齐访问的话, 大多数编译器(keil gcc)都可以想办法访问啦,多加了几条字节内存读取、移位指令而已,可移植性也没那么差了。 “__packed”关键字就是起这个作用的   

使用特权

评论回复
15
inurl|  楼主 | 2013-1-21 10:51 | 只看该作者
本帖最后由 inurl 于 2013-1-21 10:58 编辑
airwill 发表于 2013-1-5 16:44
是的, 还是别折腾自己了.

再回来翻这个帖子, 你说的地方有些也是不对的。
1、“如果运行在操作系统里,操作系统可通过exception handler fixup it” ,不是操作系统啦, 只是CPU支持的一个HardFaultException啦。
2、另外,如果CPU不支持不对齐访问的话, 大多数编译器(keil gcc)都可以想办法访问啦,多加了几条内存字节读取、移位指令而已,可移植性也没那么差了。 “__packed”关键字就是起这个作用的

使用特权

评论回复
16
inurl|  楼主 | 2013-1-21 10:59 | 只看该作者
ymind 发表于 2013-1-6 08:48
,不过要看ARMv6及其以后的。
关于操作系统模拟不对齐数据访问的指令,原理类似于定点处理器模拟执行浮点 ...


再回来翻这个帖子, 你说的地方有些也是不对的。
1、“如果运行在操作系统里,操作系统可通过exception handler fixup it” ,不是操作系统啦, 只是CPU支持的一个HardFaultException啦。
2、另外,如果CPU不支持不对齐访问的话, 大多数编译器(keil gcc)都可以想办法访问啦,多加了几条内存字节读取、移位指令而已,可移植性也没那么差了。 “__packed”关键字就是起这个作用的

使用特权

评论回复
17
xinzhaky| | 2013-1-21 15:50 | 只看该作者
楼主的理解有误,ymind的说法没有错。
1、他说的是如果在操作系统中,操作系统可以利用非对齐访问所产生的exception,来处理这个问题
2、这正是可移植性的问题,在armcc编译器中__packed关键字的作用正好和楼主所描述的gcc的关键字的作用是相反的,一套代码在不同编译器行为正好相反这正是可移植性的大忌。

使用特权

评论回复
18
inurl|  楼主 | 2013-1-21 16:29 | 只看该作者
本帖最后由 inurl 于 2013-1-21 16:45 编辑
xinzhaky 发表于 2013-1-21 15:50
楼主的理解有误,ymind的说法没有错。
1、他说的是如果在操作系统中,操作系统可以利用非对齐访问所产生的e ...

1、这和操作系统有什么关系,没操作系统也可以响应HardFaultException,也可以恢复

使用特权

评论回复
19
inurl|  楼主 | 2013-1-21 16:31 | 只看该作者
本帖最后由 inurl 于 2013-1-21 16:47 编辑
xinzhaky 发表于 2013-1-21 15:50
楼主的理解有误,ymind的说法没有错。
1、他说的是如果在操作系统中,操作系统可以利用非对齐访问所产生的e ...

2、我正是基于ARMCC描述的,GCC我还不清楚,但是相似的功能还肯定是有的,有的话就可以想办法移植。

使用特权

评论回复
20
ymind| | 2013-1-22 13:06 | 只看该作者
inurl 发表于 2013-1-21 16:31
2、我正是基于ARMCC描述的,GCC我还不清楚,但是相似的功能还肯定是有的,有的话就可以想办法移植。 ...

1. 当然裸程序可以自己写exception handler来模拟执行这种指令,但自己花大工夫纠正自己,这不是多此一举嘛,还不如修改代码源头呢。而OS纠正的话,对这种行为的应用程序就是透明的了,应用程序(甚至包括内核态的一些代码,如协议栈)不知道发生了此事,就不用按可移植性修改了,当然影响到代码效率除外。
2. “ 这正是可移植性的问题,一套代码在不同编译器行为正好相反这正是可移植性的大忌。”这句话我很认同,正是LZ要考虑的问题。
“在armcc编译器中__packed关键字的作用正好和楼主所描述的gcc的关键字的作用是相反的,”但这句应该是技术性错误,不论是ARMCC的__packed, 还是GCC的__attribute__ ((__packed__)) ,还是IAR的#pragma pack(1),都是紧凑型数据结构使用(各字段没有隐含对齐)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

293

帖子

1

粉丝