打印
[STM32F0]

M0字节对齐

[复制链接]
1997|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bxb_lhj|  楼主 | 2016-5-13 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:

#pragma pack(1)
#define STX 0x02
#define STX2 0x68
typedef  struct
        {
                uint8_t stx;
                uint16_t PkgLen;
                uint16_t Sn;                               
                uint8_t prData[64];
                uint16_t Crc16;
        } Req_Command;

__UART_H_EXT uint8_t TxBuffer[TX1LEN],RxBuffer[RX1LEN];
        Req_Command = (Req_Command*)TxBuffer;

运行*(uint16_t *)prAns_Command->prData = 0x0000;时,,发生DEFAULT

测试*(uint16_t *)&TxBuffer[11] = 0x0000;  时,,发生DEFAULT
测试*(uint16_t *)&TxBuffer[10] = 0x0000;  时,正常执行

关于对齐问题请指教,,有哪些针对这种情况的好方法,请赐教.
沙发
mzhboy| | 2016-5-14 11:36 | 只看该作者
不支持非对齐访问,当然会挂。

让编译器自动设置吧,都是对齐的,你那个 prData 是奇数地址了,而且还强制指定为 uint16_t 的指针。
uint16_t,uint32_t之类的地址必须是响应大小的整数倍

prData不要强制转就行。

再说,为啥不用DMA

使用特权

评论回复
板凳
戈卫东| | 2016-5-14 14:18 | 只看该作者
既然搞不定就不要用类型转换

使用特权

评论回复
地板
bxb_lhj|  楼主 | 2016-5-14 14:51 | 只看该作者
mzhboy 发表于 2016-5-14 11:36
不支持非对齐访问,当然会挂。

让编译器自动设置吧,都是对齐的,你那个 prData 是奇数地址了,而且还强制 ...

回去想了一下,如果牵制转换是结构体类型(使用PACK).估计强制转换就可以了。。。周一试下

使用特权

评论回复
5
bxb_lhj|  楼主 | 2016-5-14 14:51 | 只看该作者
bxb_lhj 发表于 2016-5-14 14:51
回去想了一下,如果牵制转换是结构体类型(使用PACK).估计强制转换就可以了。。。周一试下 ...

会按字节处理的。估计

使用特权

评论回复
6
bxb_lhj|  楼主 | 2016-5-14 14:52 | 只看该作者
mzhboy 发表于 2016-5-14 11:36
不支持非对齐访问,当然会挂。

让编译器自动设置吧,都是对齐的,你那个 prData 是奇数地址了,而且还强制 ...

DMA如何用?

使用特权

评论回复
7
bxb_lhj|  楼主 | 2016-5-24 13:38 | 只看该作者
测试如下:
        *(uint32_t *)Tbuf = 0x34234242;
        *(uint32_t *)&Tbuf[1] = 0x3242;
        *(uint32_t *)&Tbuf[2] = 0x3442;
        *(uint32_t *)&Tbuf[3] = 0x3442;
        *(uint32_t *)&Tbuf[4] = 0x3423;
        *(uint16_t *)&Tbuf[0] = 0x3242;       
        *(uint16_t *)&Tbuf[1] = 0x3242;
        *(uint16_t *)&Tbuf[2] = 0x3442;
        *(uint16_t *)&Tbuf[3] = 0x3442;
        *(uint16_t *)&Tbuf[4] = 0x3423;


在LPC7168上正常运行,在STM32F051上运行,执行这句话的时候出现HardFault_Handler,求解,,,,cortex不是号称可以内存不对齐的吗?
       

使用特权

评论回复
8
IversonCar| | 2016-5-25 17:32 | 只看该作者
是不是超过数组的最大值了呢?

使用特权

评论回复
9
Thor9| | 2016-5-25 21:31 | 只看该作者
不支持非对齐访问的吧

使用特权

评论回复
10
643757107| | 2016-5-25 22:05 | 只看该作者
在定义类型的时候就要想清楚了,还有取舍的问题,可以通过结构体,联合体,位段的形式来做

使用特权

评论回复
11
戈卫东| | 2016-5-25 22:49 | 只看该作者
身为菜鸟就不要把指针转换来转换去了。。。。。

使用特权

评论回复
12
hgjinwei| | 2016-5-26 08:58 | 只看该作者
指针强制转换时,必须清楚地知道CPU访问方式,否则就别老实点吧。

使用特权

评论回复
13
bxb_lhj|  楼主 | 2016-6-6 14:16 | 只看该作者
这几天有空,又查了一下资料,还是不得要领啊,我觉得做技术的遇到问题一定不能绕着走,否则一定不会有多少高度.求赐教.内存对齐

使用特权

评论回复
14
john_lee| | 2016-6-6 14:26 | 只看该作者
cortex-m0 要求必须对齐;cortex-m3 不要求对齐,但未对齐的访问会增加一次读写,慢一些。

使用特权

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

本版积分规则

21

主题

89

帖子

0

粉丝