搜索
bottom↓
回复: 20

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

[复制链接]

出0入0汤圆

发表于 2012-2-28 22:48:33 | 显示全部楼层 |阅读模式
从Keil移植程序到ICCAVR的问题:

(原文件名:ICC内存.JPG)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-2-29 08:52:54 | 显示全部楼层
ICC是小端模式的,可以设为大端模式吗?

出0入0汤圆

发表于 2012-2-29 09:04:30 | 显示全部楼层
不能。

出0入0汤圆

 楼主| 发表于 2012-2-29 13:18:28 | 显示全部楼层
请问这是由编译器决定的还是芯片的CPU决定的?

出0入0汤圆

 楼主| 发表于 2012-2-29 13:21:04 | 显示全部楼层
回复【2楼】theophilus
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-2-29 14:09:56 | 显示全部楼层
是由硬件决定,不过对于AVR和8051这些8位机,谈不上什么字节序(虽然他们都有16位寄存器,并且字节序是小端)。

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

出0入0汤圆

发表于 2012-2-29 14:48:26 | 显示全部楼层
stm8必须是大端格式。

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

出0入0汤圆

 楼主| 发表于 2012-2-29 15:22:13 | 显示全部楼层
各位做移植的时候有没有碰到过这样的呢?
虽然修改代码很容易就能解决
为什么不统一,或者编译器有可选项

出0入0汤圆

发表于 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, 不然出错都不知道怎么出的。

出0入0汤圆

 楼主| 发表于 2012-2-29 15:46:10 | 显示全部楼层
回复【8楼】theophilus
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2012-2-29 15:52:39 | 显示全部楼层
^_^,刚刚看到,Freescale单片机的CodeWarrior编译器可以选择大小端!
ICCAVR有没有这样的更能呢?


现在还没找到,,,

出0入0汤圆

发表于 2012-2-29 16:10:07 | 显示全部楼层
回复【9楼】5201314fff  风满花楼
回复【8楼】theophilus
-----------------------------------------------------------------------
我的数据正好是结构体,总共100多个字节呢,~_~
用宏来定义大小端的转换是怎么做的呢?
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2012-2-29 16:38:03 | 显示全部楼层
回复【11楼】theophilus
-----------------------------------------------------------------------

谢谢这位大哥!!!

出0入0汤圆

 楼主| 发表于 2012-2-29 18:24:08 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2012-3-1 11:15:14 | 显示全部楼层



出0入0汤圆

 楼主| 发表于 2012-3-2 14:11:59 | 显示全部楼层

出0入296汤圆

发表于 2012-3-2 14:16:06 | 显示全部楼层
我很奇怪,你为啥要关心这个编译器替你透明掉的问题——除非你是要在大小端不同的芯片间通讯。

出0入0汤圆

 楼主| 发表于 2012-3-2 15:00:48 | 显示全部楼层
回复【16楼】Gorgon_Meducer 傻孩子
-----------------------------------------------------------------------

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

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

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

出0入0汤圆

发表于 2012-3-2 16:42:06 | 显示全部楼层
简单的数据结构我直接手动写,当然会用到int16_byteswap, int32_byteswap 之类的函数

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

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

出0入0汤圆

 楼主| 发表于 2012-3-3 10:37:05 | 显示全部楼层
片上资源确实非常少

出0入0汤圆

发表于 2012-10-19 09:23:48 | 显示全部楼层
是啊,这个问题我也遇到了,在串口通信的时候有些要按标准来写协议的话转换起来确实麻烦,AVR的编译器有没有事大端模式的啊,就和KEIL的一样的,老是感觉ICC avr不太靠谱!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-12 05:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表