笔者之前在DSP6416下开发TDD模式的MAC层协议,发现了一些问题,也对时间性能做了简单优化。
在开发MAC层的过程中,发现了很多影响DSP运行速度的因素,主要包括:
1. 动态内存申请和释放,即malloc和free函数的使用。
当使用次数不多时,malloc和free的处理过程耗时为us级。但当多次动态申请内存后,free函数中会进行内存碎片整理和回收,持续时间可能会到达ms级,且具有系统最高优先级,不可被打断。严重影响MAC层实时性的响应。
因此需将使用动态申请内存的部分改为静态的内存,即用数组的方式固定占用内存。考虑到IRAM空间小,将实时性不高且大量占用空间的存储结构放到SDRAM中,通过IRAM的指针去访问。
2. 存储拷贝memcpy函数
memcpy函数是影响MAC运行速度的一个因素。memcpy对源地址和目的地址以及拷贝长度是有不同的传输速率,速率最多可相差2.5倍。如果源与目的地址都是IRAM, IRAM中代码运行速率很快,此差距可忽略。但当源与目的有一个为SDRAM时,对于8K字节,此时延可到达175us-400us范围。
原理不再赘述,目前工程中对于此问题的优化:
A. 对于大数据量的拷贝对于源地址和目的地址以及传输长度进行了规范,即源地址对齐偶地址,拷贝长度对齐8字节。效率提高将近2倍;
B. 减少memcpy的操作次数,尽量使用指针进行转移等操作。
3. printf及其他用于调试或显示的系统函数
经测试,printf函数或其它调试以及系统函数的占用时间为ms级,且具备最高的系统优先级,不响应中断,对于代码运行有严重影响。