由于有通信程序和写FLASH操作,需要大的缓存。希望能用动态内存方式实现,或开辟一片缓存,多个模块共享。
请大家指点!
已经看过下面的参考资料:前段时间移植一套协议栈(跨平台,原来平台是在CC2430上跑的符合801.25.4E标准的信标网络协议,移植到MSP430F2618+cc2520平台上)。奇怪的是,底层驱动都写好了,和协议栈上层代码接口也完全兼容,就是不能完成系统功能。纠结了大半个学期,都有想放弃了念头。后来在一次调试过程中,尝试着替换其动态内存分配机制(原来是使用CC2430的分配机制),竟然实现成功了。最近好好地把这两种分配机制研究了一下,得出这两种分配方式最大的区别在于:IAR430是16位单片机,需要字节对齐的,也就是说MSP430不像CC2430那样支持字节自动对齐调整。我们在用到通信协议时经常为其分配一个缓冲区,也就是一个字节数组,在协议处理过程中需要存储网络传输数据,这样就需要动态地分配某一个大数组的空间,用于存储数据,这时必须要求开辟的空间返回的地址为偶数地址(由编译系统规定),否则就可能导致就算开辟了空间,有些数据(如16位整数,结构体等)也是存不进去,这样就出现了所谓字节对齐的问题!
但是在IAR430中,编译器不保证字节数组的开始地址为偶数,所以必须指定其存储地址,可用__no_init_ 命令指定,如(__no_init_ unsigned char buf[N] @0x1100;)。如果程序中有比较大的数组,最好定义成非初始化的,430开始时看门狗默认是开的,大的数组需要长的初始化时间,会引起复位。不仅如此,每次分配内存时,还要保证分配的内存为偶数个,不然下次再分配时返回的地址就是奇数了。
解决以上问题方法如下:
1.用__no_init_定义一个大数组的地址为偶地址(否则,定义的数组的地址是奇地址);
2.为了解决申请的空间大小为奇数从而导致多次申请后返回的地址为奇数的情况,定义功能函数uint16 getEvenNum(uint 16 num),该函数放在内存申请 UINT8 * MemAlloc (UINT16 size) 的入口开始处;
在msp430编译环境中,只要按照上面操作,是能解决内存分配了不能赋值的问题的。
浅谈MSP430数据存储分配机制 http://www.61ic.com/Article/MSP430/MSP430/201107/35569.html
|