有所追求
分类:
2008-04-03 08:39:17
Aaron(93342183) 14:56:44请教大家一个关于ADS的问题 |
Aaron(93342183) 15:02:34ID_SET ID_DATA_N;ID_SET ID_DATA_REC;INT8U IsIdReceivedFlag = 0; //请求ID完成传送INT8U IsSyncNeedFlag = 0;//同步标志INT8U IsSyncEndFlag = 0;//花样数据完成标志0,编译环境ADS,44B0,配置存储器为16位宽度1,以上全是全局变量2,第一行分别定义两个ID_SET类型的结构体问题,我在仿真中发现,如上定义时,分配给ID_DATA_N的地址为奇地址,程序发生数据终止异常,按理说在ARM中,16位的存储器,&ID_DATA_N的值应该是偶地址啊3,把第一行调到最后面,编译出来的ID_DATA_N内存地址是偶地址,程序运行正确 |
han(3366524) 15:04:04定义结构本身的时候就考虑好对齐问题 |
Aaron(93342183) 15:06:51我ID_SET结构定义如下:
typedef struct { //同步ID
INT8U ID_COM0;
INT8U ID_COM1;
INT8U ID_COM2;
INT8U ID_COM3; //版本号
INT8U EDIT_ID1;
INT8U EDIT_ID2;
INT8U EDIT_ID3;
}ID_SET;//同步ID及版本号全部是字节变量,如果基本型是按照本身大小对齐,结构体以8字节为对齐单位的话,以上结构体大小应该为8字节,事实上,我测试过确实是8字节 |
han(3366524) 15:08:267个 |
Aaron(93342183) 15:08:39why? |
han(3366524) 15:08:50你自己数数 |
|
Aaron(93342183) 15:09:05我用sizeof(ID_SET)测试过 |
Aaron(93342183) 15:09:24结构体大小不是总的变量大小相加 |
Aaron(93342183) 15:09:45而是考虑对齐后再计算的, |
han(3366524) 15:09:56得,成了你教我了 |
Aaron(93342183) 15:10:17互相讨论了, |
Aaron(93342183) 15:10:23我也不是很清楚 |
Aaron(93342183) 15:11:58那么你说 的7个是怎么计算的?比如struct a{ int a; char b; float c; }temp;sizeof(temp) = ? |
Aaron(93342183) 15:12:28在32位机中,32位编译环境 |
han(3366524) 15:13:27没时间看这些,估计老铁爱和你绊这个 |
han(3366524) 15:13:58反正我要是写7个byte的变量,肯定加1个不使用的凑齐 |
peewee(258382557) 15:15:08领导:辛苦了这么久,来,我下面给你吃 楼主:啊!啊。。。这样不太好吧? 领导:有什么不好的,在家里你就别当我是领导,随便一点 楼主:呃。。。我还是不太习惯,一般都是女人吃我下面 领导:呵呵,看不出来你还挺能干嘛,那好啊,你来吧 楼主:我是非常的能干啊,嘿嘿! 。。。。。 领导:你,你。。你脱裤子干嘛?! 楼主:给你吃我下面啊? 领导:。。。。敢跟老娘耍流氓?!呀嗨! 楼主:啊!哦哦~~哦~~ |
Aaron(93342183) 15:15:15我加过,在最后加了个INT8U temp,他娘的,结果还是那样 |
|
han(3366524) 15:16:31那再往前查喽,如果前面没别的东西导致这个分配,不会一来就占用奇地址的 |
han(3366524) 15:16:48如果你的整个工程都符合手工的对齐原则,不会产生这些的问题 |
Aaron(93342183) 21:47:18我在程序中定义了一个数据结构类型,并用此类型定义了一个数据结构,如下: typedef struct { //同步ID INT8U ID_COM0; INT8U ID_COM1; INT8U ID_COM2; INT8U ID_COM3; //版本号 INT8U EDIT_ID1; INT8U EDIT_ID2; INT8U EDIT_ID3; }ID_SET; ID_SET Id;仿真运行时发现定义的Id的地址为奇地址,0x0c007867;对于ARM来讲,当选择ARM模式或者THUMB模式,小端对齐,选择16位的SDRAM,那么给变量分配地址时,这个变量的地址是任意形式的还是位数一定为0?我的理解是:a,ARM是32位系统,如果选择ARM模式,小端对齐,指令地址最后两位必须是00;b,如果存储器选择16位,那么给变量(包括全局变量)分配的地址单元是偶地址。例如:INT8U tmp;那么这个tmp所在的内存单元可能是0x0c00_1200,但是不可能是0x0c00_1201. |
Intercessor(125792309) 21:51:10因为ID_SET的字节数为奇数个,所以很有可能放在奇地址上。 |
Intercessor(125792309) 21:52:14如果定义一个字节数为偶数但只能被2整除的,那么也有可能放在不能被4但能被2整除的地址上。 |
Intercessor(125792309) 21:53:03如果不管什么类型一律都放在偶地址上,那么可能会对存储器有些浪费了。 |
Intercessor(125792309) 21:53:53否则的话,还是像han所讲的利用汇编中的directive或C/C++中的pragma进行手动对齐。 |
Aaron(93342183) 21:54:01恩 |
Aaron(93342183) 21:54:04谢谢 |
Aaron(93342183) 21:55:06BBS上也有些朋友遇到这个问题,说是要手工对其 |
han(3366524) 21:55:09我啥时候说那么专业的话了 |
Aaron(93342183) 21:55:15哈 |
han(3366524) 21:55:17不要吓人哦 |
Aaron(93342183) 21:55:29感觉你在我下班之前好像说过 |
han(3366524) 21:56:17打算买个床上电脑桌 |
|
|
|
Aaron(93342183) 21:56:51我 的程序只要运行到对那个奇地址的数据进行操作,就会发生数据异常终止,程序跳转到0x10处,说明 |
han(3366524) 21:56:56品 牌:索玲珑 尺 寸:55*35*35cm ,翻盖部分35cm (加高腿是10公分) 材 料:俄罗斯樟子松 重 量: 3800.00g 颜 色:本木色 款式:升降式 类型床上本本桌(最大高度<45cm) |
han(3366524) 21:57:18腿就可以解放出来了 |
Aaron(93342183) 21:57:44哈,学校好像卖30-35 |
Intercessor(125792309) 21:58:17还有一个简单的方法就是在结构体最后加一个INT8U dummy |
Intercessor(125792309) 21:58:25补充到8个字节。 |
Aaron(93342183) 21:58:53这个我加过,没用, |
Intercessor(125792309) 21:59:01没用? |
Aaron(93342183) 21:59:03恩 |
Intercessor(125792309) 21:59:09难道还是在奇地址上? |
Aaron(93342183) 21:59:10我试过的 |
Aaron(93342183) 21:59:26是的,起始地址还在奇数地址上 |
Aaron(93342183) 21:59:51把定义变量的位置挪了挪,就好了 |
Intercessor(125792309) 22:00:19那个地方挪了一下? |
Aaron(93342183) 22:00:41结果老大跟我说:这个问题的原因一定要查清楚,不然程序会有很多隐含 的不稳定因素 |
Aaron(93342183) 22:01:22ID_SET ID_DATA_N;ID_SET ID_DATA_REC;INT8U IsIdReceivedFlag = 0; //请求ID完成传送INT8U IsSyncNeedFlag = 0;//同步标志INT8U IsSyncEndFlag = 0;//花样数据完成标志0,编译环境ADS,44B0,配置存储器为16位宽度1,以上全是全局变量2,第一行分别定义两个ID_SET类型的结构体问题,我在仿真中发现,如上定义时,分配给ID_DATA_N的地址为奇地址,程序发生数据终止异常,按理说在ARM中,16位的存储器,&ID_DATA_N的值应该是偶地址啊3,把第一行调到最后面,编译出来的ID_DATA_N内存地址是偶地址,程序运行正确 |
Aaron(93342183) 22:01:30上面是我下午发的 |
Intercessor(125792309) 22:01:35哦。 |
Intercessor(125792309) 22:02:01可能编译器主要看重你的结构体都是一个字节的成员。 |
寂寞小刀(22470886) 22:02:09听高手讨论字节对齐问题 |
寂寞小刀(22470886) 22:02:15 |
Intercessor(125792309) 22:03:21对一个字节的变量进行访问会有指令异常吗? |
Intercessor(125792309) 22:04:04嗯。 |
Aaron(93342183) 22:04:04不会 |
Intercessor(125792309) 22:04:26哦。我了解你的意思了。 |
Aaron(93342183) 22:04:28很晕倒一个现象 |
Intercessor(125792309) 22:05:03如果是偶地址的话运行时不会发生异常吧? |
Aaron(93342183) 22:05:29如果是偶地址,程序跑的滴溜溜转 |
Intercessor(125792309) 22:05:43 |
Aaron(93342183) 22:06:10在编译分配时,怎么会给这个结构分配一个奇数地址呢? |
Aaron(93342183) 22:06:15想不通啊 |
Intercessor(125792309) 22:06:46这个就要看编译器了。 |
Intercessor(125792309) 22:07:56不过如果是7个字节的结构变量的话分配到奇地址是很正常的。 |
Aaron(93342183) 22:08:35但是编译器也好像考虑到了结构体对齐原则,上面那个结构体sizeof下来,是8字节 |
Intercessor(125792309) 22:08:49是嘛。 |
Intercessor(125792309) 22:08:54这个就比较奇怪了。 |
Aaron(93342183) 22:09:01恩 |
寂寞小刀(22470886) 22:09:08是8字节 |
Aaron(93342183) 22:09:11对头 |
Aaron(93342183) 22:09:15十分的对 |
Intercessor(125792309) 22:09:18你的编译选项是要求结构体以4字节对齐? |
Aaron(93342183) 22:09:288字节 |
Intercessor(125792309) 22:09:37那么大。 |
寂寞小刀(22470886) 22:09:41ADS? |
Aaron(93342183) 22:09:43恩 |
寂寞小刀(22470886) 22:09:55 |
Intercessor(125792309) 22:10:07如果我定义一个结构体只有两个char型的变量,那么它的大小也是8字节? |
Aaron(93342183) 22:10:32我采用的默认的 |
Intercessor(125792309) 22:10:42哦。 |
Intercessor(125792309) 22:11:04这个问题我好像还没有碰到过。 |
Aaron(93342183) 22:11:06不过ADS在哪儿操作这个对齐选项? |
Intercessor(125792309) 22:11:42那么现在只能通过编译指示让Id分配到偶地址了。 |
Intercessor(125792309) 22:12:11我对ADS开发环境不熟悉。 |
寂寞小刀(22470886) 22:12:17为什么一定要放在偶地址 |
Intercessor(125792309) 22:12:17你可以参考相关文档。 |
Aaron(93342183) 22:15:39配置的16位SDRAM,只要假设地址0x0C001200在SDRAM地址范围内,如果我执行 A =(*0x0C001200),程序正常,但是执行 A =(*0x0C001201),异常终止,跳转到0x10 |
寂寞小刀(22470886) 22:16:16 |
han(3366524) 22:16:53一圈了,又转过来了 |
Intercessor(125792309) 22:16:59A的宽度是不是2个字节的? |
han(3366524) 22:17:05下午我说的是让你查别的地方的代码 |
Aaron(93342183) 22:17:07上面读地址写的不规范,不过能说明意思 |
han(3366524) 22:17:14这个结构肯定要填充成8字节的 |
Aaron(93342183) 22:17:22INT32U A; |
Intercessor(125792309) 22:17:31果然啊。 |
han(3366524) 22:17:40但是如果其它地方的变量有问题,编译器分配的时候也就分到奇地址去了 |
Aaron(93342183) 22:17:40关键是我填充成8字节了还是这个问题啊 |
Aaron(93342183) 22:18:14有道理 |
han(3366524) 22:18:15大部分编译器默认是按.o的文件名顺序来分配变量的 |
Aaron(93342183) 22:18:09 |
Intercessor(125792309) 22:18:18如果A的宽度是单个字节的话运行A =(INT8U)(*0x0C001201)不会有任何问题。 |
han(3366524) 22:18:23如果有makefile,按makefile的顺序 |
han(3366524) 22:18:41你现在要考虑的是整个工程,不是单一的文件 |
Aaron(93342183) 22:18:45恩 |
Aaron(93342183) 22:18:57INTER的意思我也大概明白了 |
han(3366524) 22:19:08变量分配是链接的时候确定的,也就是之前我说的意思了 |
Aaron(93342183) 22:19:12恩 |
han(3366524) 22:19:47另外ads里还有一个打散对齐的关键字,我想不起来了 |
Aaron(93342183) 22:20:00明天我试试看 |
han(3366524) 22:20:04你也可以用那个关键字把每一个结构定义都加上 |
Aaron(93342183) 22:20:16__PAKED |
Aaron(93342183) 22:20:31__packed |
han(3366524) 22:21:17 不记得了,这个是亡羊补牢的办法,如果你有一个写程序的良好习惯,是用不上的 |
Aaron(93342183) 22:22:04恩!是的啊 |
寂寞小刀(22470886) 22:22:09怎么讲? |
Aaron(93342183) 22:22:13不过这个程序我是第三个人了 |
Aaron(93342183) 22:22:25现在我在整理优化程序, |
han(3366524) 22:22:47用别人的东西很可怕啊 呵呵 |
Intercessor(125792309) 22:23:00 |
han(3366524) 22:23:05我是宁愿看懂了重写 |
Aaron(93342183) 22:23:08现在虽然各位朋友给我解释了很多,很感谢啊!但是心里真的很可怕 |
han(3366524) 22:23:14当然,是小工作量的前提下 |
Aaron(93342183) 22:23:24很多未知问题,以前同事写代码的习惯不好, |
蓝色天空(23823014) 22:23:50不太可能吧,结构提都分配的是偶地址! |
Aaron(93342183) 22:23:54我的程序仅应用代码大小达到了5-6M了 |
Aaron(93342183) 22:24:17我也希望都是这样 |
蓝色天空(23823014) 22:24:21你是用指针造成的吧! |
han(3366524) 22:24:38仅应用代码大小达到了5-6M 太恐怖了 |
蓝色天空(23823014) 22:24:49把你程序稍微完整的贴一下! |
han(3366524) 22:24:53够放十来个dos系统了 |
Aaron(93342183) 22:25:21仅仅在取地址时用了指针,因为要读SDRAM嘛 |
蓝色天空(23823014) 22:25:25ID_SET 这个定义在哪! |
Aaron(93342183) 22:25:41文件的开头 |
寂寞小刀(22470886) 22:25:43 typedef struct { //同步ID INT8U ID_COM0; INT8U ID_COM1; INT8U ID_COM2; INT8U ID_COM3; //版本号 INT8U EDIT_ID1; INT8U EDIT_ID2; INT8U EDIT_ID3; }ID_SET; ID_SET Id; |
蓝色天空(23823014) 22:25:50把你定义和出为体的代码贴出来! |
Aaron(93342183) 22:26:46定义如上:下面是.C文件#include "time.h"#include "Text.h"#include "ProgBar.h"#include "hmi.h"#include "button.h"#include "barFigure.h"#include "sew_data.h"#include "icon.h"#include "bar.h"#include "Error.h"#define _SYSFIGCURRENT_H_#include "SysFigCurrent.h"#include "SaveMessage.h"#include "barRandomSel.h"#include |
Aaron(93342183) 22:28:17不过说实话,仅上面这段写的就知道编程素养蛮不好的 |
蓝色天空(23823014) 22:28:29发生异常的代码呢! |
蓝色天空(23823014) 22:29:01是,挺好! |
寂寞小刀(22470886) 22:29:08 |
Aaron(93342183) 22:29:24蛮不好的 |
寂寞小刀(22470886) 22:29:36没看出来 |
Intercessor(125792309) 22:30:07我估计肯定是用类似与Id = *(SET_ID*)0xc01200_0123;这种 |
蓝色天空(23823014) 22:30:08其实学会看别人程序也是很有学问的哈! |
蓝色天空(23823014) 22:30:29ID_SET Id; |
Aaron(93342183) 22:30:46定义一个字节,用了好几种方式,不统一 |
Intercessor(125792309) 22:31:12哪条语句执行后会发生异常? |
Aaron(93342183) 22:31:41case SAVE_ID_DATA: // 存ID号 SST_SectorProg(SAVE_MESSAGE_ID_DATA_ADDR,(pB0SIZE *)&ID_DATA_N,sizeof(ID_DATA_N)); break; |
Intercessor(125792309) 22:32:02(pB0SIZE *)&ID_DATA_N, |
Aaron(93342183) 22:32:20buffer[(i - base_addr) / sizeof(pB0SIZE)] = *data; |
寂寞小刀(22470886) 22:32:27这个蛮好玩的 |
Aaron(93342183) 22:32:44小刀也给个意见哈 |
Aaron(93342183) 22:32:48好玩在哪 |
Intercessor(125792309) 22:33:02data是不是&ID_DATA_N的行参? |
Aaron(93342183) 22:33:07运行发生异常的代码 buffer[(i - base_addr) / sizeof(pB0SIZE)] = *data; |
蓝色天空(23823014) 22:33:14你不能把程序连续点啊! |
Intercessor(125792309) 22:34:02buffer的类型是什么?data的类型是什么? |
Aaron(93342183) 22:34:38等一下,我说说:SST_SectorProg(SAVE_MESSAGE_ID_DATA_ADDR,(pB0SIZE *)&ID_DATA_N,sizeof(ID_DATA_N));里面有段代码buffer[(i - base_addr) / sizeof(pB0SIZE)] = *data;,运行这段代码就会出问题static pB0SIZE buffer[SECTOR_SIZE / sizeof(pB0SIZE)]; |
蓝色天空(23823014) 22:34:52说实在没发看,你这样贴! |
Intercessor(125792309) 22:35:07pB0SIZE占几个字节? |
Aaron(93342183) 22:35:12呵呵不好意思啊,我来不及打字 |
寂寞小刀(22470886) 22:35:15了解 了解 看高手解答 |
Aaron(93342183) 22:35:172个字节 |
Intercessor(125792309) 22:35:18没关系 |
Intercessor(125792309) 22:35:31那么data是什么类型? |
蓝色天空(23823014) 22:35:39pB0SIZE怎么定义? |
蓝色天空(23823014) 22:35:46貌是指针! |
蓝色天空(23823014) 22:35:53应该是4字节啊! |
Intercessor(125792309) 22:35:53这个已经不重要了。 |
Intercessor(125792309) 22:35:59关键看data |
Intercessor(125792309) 22:36:06就有问题了。 |
蓝色天空(23823014) 22:36:21data哪来的? |
Aaron(93342183) 22:36:22typedef unsigned short pB0SIZE |
Intercessor(125792309) 22:36:28好。 |
Aaron(93342183) 22:36:46pB0SIZE * data;pB0SIZE * |
寂寞小刀(22470886) 22:36:58貌似没有问题 |
Intercessor(125792309) 22:37:05那么data是不是指向&ID_DATA_N |
Aaron(93342183) 22:37:31是的,&ID_DATA_N 正是传入的参数,传给data |
Intercessor(125792309) 22:37:45我个人感觉这样做很不好。 |
Intercessor(125792309) 22:37:51虽然速度更快。 |
Intercessor(125792309) 22:38:09但是对于这种情况,我更偏好与使用单字节拷贝方式。 |
Intercessor(125792309) 22:38:23问题已经找到了。 |
Intercessor(125792309) 22:38:31确实和我想的一样。 |
寂寞小刀(22470886) 22:38:36memcpy? |
Aaron(93342183) 22:38:40恩,究竟是什么原因呢? |
Intercessor(125792309) 22:38:41嗯。 |
Intercessor(125792309) 22:39:02其实使用单字节拷贝加上硬件循环器速度也不会太慢。 |
蓝色天空(23823014) 22:39:06........... |
Intercessor(125792309) 22:39:15不是已经说了嘛。 |
寂寞小刀(22470886) 22:39:19我觉得尽量用ANSI C的标准库函数绝对是个好习惯 |
Intercessor(125792309) 22:39:29ID_DATA_N在奇地址。 |
han(3366524) 22:39:37我偏好使用int拷贝 |
han(3366524) 22:39:42 |
Intercessor(125792309) 22:39:47但是对该奇地址却取了2个字节的内容。 |
Intercessor(125792309) 22:39:54问题出在*data上。 |
Aaron(93342183) 22:40:00哦 |
han(3366524) 22:40:12ANSI C的标准库函数,在mcu里面,我基本上都不用,要用的自己重写一个 |
寂寞小刀(22470886) 22:40:13Intercessor 强人 |
蓝色天空(23823014) 22:40:22呵呵,他没说buff是short |
Aaron(93342183) 22:40:31我现在又在想了,编译器怎么会把那个东西放在奇数地址上呢 |
Intercessor(125792309) 22:40:43buff基本上不用看了。 |
Intercessor(125792309) 22:41:03嗯。你可以mail给ADS那个公司。 |
寂寞小刀(22470886) 22:41:09按理说 SIZEOF 偶数的 基本放在偶位置 奇数的就不一定 貌似是这样 |
Intercessor(125792309) 22:41:25嗯。我也对此感到十分惊讶。 |
Intercessor(125792309) 22:41:51在ADI的VisualDSP++环境下不会有这种情况发生的。 |
Aaron(93342183) 22:42:05是啊。刚才我同时也看到一篇文章,分析了一下类似的这个问题,也是蛮深入的,谢谢给为,尤其是INTER |
蓝色天空(23823014) 22:42:13好象不管奇偶都是偶开始把,除非你指定 |
Aaron(93342183) 22:42:26IA-32也不会有这个情况 |
Aaron(93342183) 22:42:40http://blog.csdn.net/socoola/archive/2008/03/14/2183402.aspx |
蓝色天空(23823014) 22:42:55你确定ads会这样,我怎么没遇到?... |
Intercessor(125792309) 22:43:03如果是Intel处理器的话,你可以对一个奇地址取4个字节。 |
寂寞小刀(22470886) 22:43:09Intercessor 你用BLACKFIN? |
Aaron(93342183) 22:43:08大家也可以看看这个文章,我觉得对我有帮组 |
Intercessor(125792309) 22:43:24硬件在处理这条指令时会进行相应处理。 |
Intercessor(125792309) 22:43:28对。 |
Intercessor(125792309) 22:43:32你也知道? |
Intercessor(125792309) 22:43:55我现在在玩Blackfin561 Dual Core DSP |
寂寞小刀(22470886) 22:44:17ADI的指令不好玩 我不喜欢 |
Intercessor(125792309) 22:44:31不过公司里叫我做网络数据库的东东,现在也比较忙。等5月份以后空的时候再继续。 |
Intercessor(125792309) 22:44:37呵呵。 |
Intercessor(125792309) 22:44:47我一开始也感觉怪怪的。 |
Intercessor(125792309) 22:44:53不过现在已经习惯了。 |
Intercessor(125792309) 22:44:59觉得挺有味道的。 |
Aaron(93342183) 22:45:20我明天把朋友们的意见总结一下做个测试,谢谢啦。 |
寂寞小刀(22470886) 22:45:20貌似有C的编译器啊 后来 |
Intercessor(125792309) 22:45:42不过Blackfin的核心架构还是不错的,很欣赏它的中断控制器。 |
蓝色天空(23823014) 22:46:09我怎么定义都没发现在基地址的结构体,呵呵! |
Intercessor(125792309) 22:46:18呵呵。 |
寂寞小刀(22470886) 22:46:38精度高 |
Intercessor(125792309) 22:47:26嗯。还有其它一些DSP所有的向量操作、Video操作专用指令等也很实用。 |
蓝色天空(23823014) 22:47:31谁给个测试代码,我总觉得人家编译器不会犯这错误吧! |
Aaron(93342183) 22:48:11估计不太好测试,只能基于我的整个系统做测试了 |
Aaron(93342183) 22:48:20要不明天抓个图给蓝色 |
寂寞小刀(22470886) 22:48:25Intercessor 貌似对IC架构很有研究啊 |
蓝色天空(23823014) 22:48:50好的,你点太背了,呵呵! |
Intercessor(125792309) 22:48:52定义一个带有奇数个字节的结构体,然后在全局多定义该结构体类型的变量试试。 |
Intercessor(125792309) 22:49:04最好是连续地 |
寂寞小刀(22470886) 22:49:23结果就是有奇有偶 |
蓝色天空(23823014) 22:49:32我以前试过,好象没发现啊! |
寂寞小刀(22470886) 22:49:27 |
Intercessor(125792309) 22:49:33typedef struct { unsigned char a, b, c; }TEST; TEST a, b, c, d, e; |
蓝色天空(23823014) 22:49:40我再试 |
Aaron(93342183) 22:49:53我等蓝色的结果 |
寂寞小刀(22470886) 22:49:57COME ON 在线等结果 |
Intercessor(125792309) 22:50:18我也在VisualDSP++上试试。 |
寂寞小刀(22470886) 22:50:44COME ON |
Aaron(93342183) 22:50:51我明天再把VC装起来,现在都不好试了, |
Intercessor(125792309) 22:52:15有了 |
寂寞小刀(22470886) 22:52:25 |
Intercessor(125792309) 22:52:28 |
Aaron(93342183) 22:53:12b的地址是F |
Intercessor(125792309) 22:53:19对。 |
Intercessor(125792309) 22:53:25还有d |
Aaron(93342183) 22:53:42在PC平台,INTEL的处理器? |
寂寞小刀(22470886) 22:53:47 |
Intercessor(125792309) 22:53:49这些变量都分配在数据SRAM上。 |
Intercessor(125792309) 22:53:56Blackfin561 |
寂寞小刀(22470886) 22:54:16内置的SRAM? |
蓝色天空(23823014) 22:54:20ads |
蓝色天空(23823014) 22:54:21 |
Intercessor(125792309) 22:54:33是的。属于片上SRAM |
寂寞小刀(22470886) 22:54:34结果一样啊 睡觉睡觉 |
Aaron(93342183) 22:54:38也是一样 |
Aaron(93342183) 22:54:46呵呵,谢谢大家, |
Intercessor(125792309) 22:55:00 |
蓝色天空(23823014) 22:55:01但,我加个short看看! |
Intercessor(125792309) 22:55:07好。 |
Intercessor(125792309) 22:55:17我再加一个unsigned char dummy |
寂寞小刀(22470886) 22:55:28加short应该是偶数地址了 |
Intercessor(125792309) 22:56:04typedef struct { unsigned char a, b, c, dummy; }TEST; TEST a, b, c, d, e; int main(void) { return 0; } |
寂寞小刀(22470886) 22:56:25COME ON |
蓝色天空(23823014) 22:56:26 |
Aaron(93342183) 22:56:31
yes |
Intercessor(125792309) 22:56:31 |
蓝色天空(23823014) 22:56:45typedef struct { unsigned char a, b, c; short d; }TEST; |
寂寞小刀(22470886) 22:56:45 |
水星(39563214) 22:56:50 |
水星(39563214) 22:56:56我来啦 |
寂寞小刀(22470886) 22:57:03一切近在掌握啊 |
寂寞小刀(22470886) 22:57:08鸡鸡 |
寂寞小刀(22470886) 22:57:14 |
蓝色天空(23823014) 22:57:18呵呵,还是点背,就是没出现异常的情况 |
Aaron(93342183) 22:59:49对那个为奇地址的b执行读数据操作(一定要取其地址)试试看 |
Aaron(93342183) 23:00:57不能用b.a,用TMP=*(&b)试试看 |
寂寞小刀(22470886) 23:01:54 |
寂寞小刀(22470886) 23:01:58 |
蓝色天空(23823014) 23:02:14不用试了,按照你的上面测试,你那出错是正常的哈! |
寂寞小刀(22470886) 23:02:20 |
蓝色天空(23823014) 23:02:25不是别人编译器问题! |
蓝色天空(23823014) 23:02:33是你用的有 |
蓝色天空(23823014) 23:02:38问题 |
Aaron(93342183) 23:02:38什么问题? |
Intercessor(125792309) 23:03:18不一定是他用。 |
Aaron(93342183) 23:03:25呵呵 |
Intercessor(125792309) 23:03:28可能代码是人家以前写好地 |
蓝色天空(23823014) 23:03:30ID_SET ID_DATA_N; 成员不都是char吗? |
Intercessor(125792309) 23:03:30呵呵。 |
Aaron(93342183) 23:03:38是char |
蓝色天空(23823014) 23:03:42反正就是代码有问题 |
Aaron(93342183) 23:04:07是char会怎么? |
蓝色天空(23823014) 23:04:18那编译器只保证字节对其 |
Aaron(93342183) 23:04:43恩 |
蓝色天空(23823014) 23:05:25所以有挤地址不奇怪啊! |
Aaron(93342183) 23:05:28是这样。那么你试试看这样操作是不是有问题。我 |
Aaron(93342183) 23:06:02我等结果,谢谢啊。如果你试下来也有,那么明天我得去修改操作SDRAM的驱动力 |
Intercessor(125792309) 23:06:21如果那个编译器在结构体为偶数个字节的情况下依然将其定义的变量放在首地址为奇地址的存储单元,那么确实有些问题。不过那个函数建议使用单字节拷贝,以速度换安全,呵呵。 |
Aaron(93342183) 23:06:57如上,确实是这样 |
蓝色天空(23823014) 23:07:22我觉得不应该这样理解吧! |
Intercessor(125792309) 23:07:54如果是Blackfin的话有并行指令操作,可以将取数据指令与写数据指令进行并行执行,再加上loop循环器,速度很快。 |
蓝色天空(23823014) 23:08:15编译器是尽量保证占用最少资源和执行时间 |
Aaron(93342183) 23:08:30蓝色天空,我等你的结果再回宿舍睡觉 |
Intercessor(125792309) 23:08:37对的。 |
蓝色天空(23823014) 23:08:48tmp什么类型! |
蓝色天空(23823014) 23:08:53没什么问题啊! |
Aaron(93342183) 23:09:08对及地址用指针读取也没问题? |
Intercessor(125792309) 23:09:11但是如果将一个int型的变量(16位环境中)分配在奇地址,你会如何考虑? |
Aaron(93342183) 23:09:18那就奇怪了 |
蓝色天空(23823014) 23:09:48我想没问题,我试 |
Aaron(93342183) 23:10:10好的。不过我目标板上是有问题的 |
Intercessor(125792309) 23:10:25对奇地址做偶数个字节的访问当然要出问题。 |
Intercessor(125792309) 23:11:29奇地址在16位或32位环境下只能访问单字节数据。 |
Aaron(93342183) 23:11:31ARM有数据异常机制,程序不会跑飞,会认为你操作的这个地址是非法地址,然后就把PC拉到0x10处,那儿是数据异常的地址 |
Intercessor(125792309) 23:11:42嗯。 |
Intercessor(125792309) 23:11:58这个在Blackfin里也有,属于指令异常中断。 |
Intercessor(125792309) 23:12:10Address mis-aligned Exception |
蓝色天空(23823014) 23:12:15没问题 |
Aaron(93342183) 23:12:20不对齐中断。 |
蓝色天空(23823014) 23:12:23aa = *((char *)&b); |
Intercessor(125792309) 23:12:27该中断向量可以由用户来定。 |
Intercessor(125792309) 23:12:40对。 |
Intercessor(125792309) 23:12:45这样是没问题的。 |
Aaron(93342183) 23:12:57char类型改成short看看,我的是short |
Intercessor(125792309) 23:13:06如果把char*改成short*就有的看了。 |
蓝色天空(23823014) 23:14:23那当然有问题了! |
Intercessor(125792309) 23:14:31如果aa = *((char *)&b);也有问题的话就没办法解决了,呵呵。 |
Intercessor(125792309) 23:14:44呵呵,那是。 |
Aaron(93342183) 23:15:02哈,是不是那样测试下来确实有问题了? |
Aaron(93342183) 23:15:19我现在心里巴望一定要有问题啊 |
Aaron(93342183) 23:15:30那样这个问题算是解决了 |
Intercessor(125792309) 23:16:00那么我先睡了。 |
Aaron(93342183) 23:16:12恩,INTER 88 |
Intercessor(125792309) 23:16:20 |
蓝色天空(23823014) 23:16:33呵呵,不能怪人家编译器,还是代码问题! |
Aaron(93342183) 23:17:02恩,是的。我意识到了 |
蓝色天空(23823014) 23:17:20看memcpy的实现,其实用memcpy好象就多一条汇编! |
Aaron(93342183) 23:17:46对头,那么以后用这个memcpy |
蓝色天空(23823014) 23:18:42以前自己写memcpy,但怎么写都没库里的快! |
Aaron(93342183) 23:18:49呵呵 |
蓝色天空(23823014) 23:18:53所以还是用库里的了! |
Aaron(93342183) 23:19:03我回去啦,谢谢蓝色你的测试, |
蓝色天空(23823014) 23:19:11没是88 |
Aaron(93342183) 23:19:1488 |
蓝色天空(23823014) 23:19:18睡了! |