5201314fff 发表于 2012-2-28 22:48:33

请教 ICCAVR 的变量在内存里存储的问题

从Keil移植程序到ICCAVR的问题:
http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_722978QG3GU9.JPG
(原文件名:ICC内存.JPG)

5201314fff 发表于 2012-2-29 08:52:54

ICC是小端模式的,可以设为大端模式吗?

theophilus 发表于 2012-2-29 09:04:30

不能。

5201314fff 发表于 2012-2-29 13:18:28

请问这是由编译器决定的还是芯片的CPU决定的?

5201314fff 发表于 2012-2-29 13:21:04

回复【2楼】theophilus
-----------------------------------------------------------------------

请问这是由编译器决定的还是芯片的CPU决定的?

theophilus 发表于 2012-2-29 14:09:56

是由硬件决定,不过对于AVR和8051这些8位机,谈不上什么字节序(虽然他们都有16位寄存器,并且字节序是小端)。

就主要看看编译器实现了(准确的说是编译器带的库,比如怎么实现大于1字节类型的算数运算等)

uc_stm32f050 发表于 2012-2-29 14:48:26

stm8必须是大端格式。

51,AVR 如 IAR8051,IARAVR都是小端模式。

5201314fff 发表于 2012-2-29 15:22:13

各位做移植的时候有没有碰到过这样的呢?
虽然修改代码很容易就能解决
为什么不统一,或者编译器有可选项

theophilus 发表于 2012-2-29 15:32:19

回复【6楼】uc_stm32f050招开发工程师(深圳)
stm8必须是大端格式。
51,avr 如 iar8051,iaravr都是小端模式。
-----------------------------------------------------------------------
嗯,stm8虽然后面有个8,不过可以直接操作16位,硬件上就是大端的。



回复【7楼】5201314fff风满花楼
各位做移植的时候有没有碰到过这样的呢?
虽然修改代码很容易就能解决
为什么不统一,或者编译器有可选项
-----------------------------------------------------------------------
要不就加一层,用宏来定义大小端的转换,比较烦的是结构体,每个元素都要转换。
一种通行的办法就是用字符串(8bit编码的),就不用考虑字节序问题了,当然更占资源。

要求C Runtime做成这样工作量实在是太大了,而且跟编译器也有一定关系,尤其是在8位机上实现。(比如int16, int32, int64的算数运算,每个都要做两份,float也要做两份,加减乘除都要做,还要包括逻辑运算),然后一份BE的编译器还要对应一份 BE 的LIB, 不然出错都不知道怎么出的。

5201314fff 发表于 2012-2-29 15:46:10

回复【8楼】theophilus
-----------------------------------------------------------------------

我的数据正好是结构体,总共100多个字节呢,~_~
用宏来定义大小端的转换是怎么做的呢?

5201314fff 发表于 2012-2-29 15:52:39

^_^,刚刚看到,Freescale单片机的CodeWarrior编译器可以选择大小端!
ICCAVR有没有这样的更能呢?


现在还没找到,,,

theophilus 发表于 2012-2-29 16:10:07

回复【9楼】5201314fff风满花楼
回复【8楼】theophilus
-----------------------------------------------------------------------
我的数据正好是结构体,总共100多个字节呢,~_~
用宏来定义大小端的转换是怎么做的呢?
-----------------------------------------------------------------------

你这样手写太痛苦了,学一门脚本吧,然后写个脚本来处理它,然后实现序列化,反序列化的函数。

5201314fff 发表于 2012-2-29 16:38:03

回复【11楼】theophilus
-----------------------------------------------------------------------

谢谢这位大哥!!!

5201314fff 发表于 2012-2-29 18:24:08

./emotion/em019.gif./emotion/em019.gif./emotion/em019.gif./emotion/em019.gif

5201314fff 发表于 2012-3-1 11:15:14

./emotion/em001.gif./emotion/em001.gif./emotion/em001.gif./emotion/em001.gif
./emotion/em001.gif./emotion/em001.gif./emotion/em001.gif
./emotion/em001.gif./emotion/em001.gif
./emotion/em001.gif

5201314fff 发表于 2012-3-2 14:11:59

./emotion/em024.gif./emotion/em024.gif./emotion/em024.gif

Gorgon_Meducer 发表于 2012-3-2 14:16:06

我很奇怪,你为啥要关心这个编译器替你透明掉的问题——除非你是要在大小端不同的芯片间通讯。

5201314fff 发表于 2012-3-2 15:00:48

回复【16楼】Gorgon_Meducer 傻孩子
-----------------------------------------------------------------------

说对了,就是要在大小端不同的芯片间通讯

虽然现在用别的方法解决了,

只是想看看大家对这个有什么方法

theophilus 发表于 2012-3-2 16:42:06

简单的数据结构我直接手动写,当然会用到int16_byteswap, int32_byteswap 之类的函数

包含较多元素的固定长度的struct我都是用脚本来生成相应的encoder和decoder.

对于复杂的协议,如果不太担心片上资源,我要么用字符串传递(这个自由度较高,有很交换格式可以用)
或者用protobuf, MCU上使用nanopb.

5201314fff 发表于 2012-3-3 10:37:05

片上资源确实非常少

po-shieh 发表于 2012-10-19 09:23:48

是啊,这个问题我也遇到了,在串口通信的时候有些要按标准来写协议的话转换起来确实麻烦,AVR的编译器有没有事大端模式的啊,就和KEIL的一样的,老是感觉ICC avr不太靠谱!
页: [1]
查看完整版本: 请教 ICCAVR 的变量在内存里存储的问题