本帖最后由 chinaqiaobo 于 2015-4-13 15:49 编辑
刚刚在STM32F4上移植好了ucos-ii,接下来要做的就是lwip的移植了,在官网下载最新版本1.4.1,同时参考了ST官方的移植方案,只不过ST是在freertos上做的移植,freertos和ucos-ii还是在某些机制上存在一些区别的。
问题如下:
sys_arch.c中,需要向lwip内核提供一些os服务,如mbox,sem等操作。
例如需要实现这个函数:
err_t sys_mbox_new(sys_mbox_t *mbox, int size);
在freertos中,sys_mbox_t通过追踪define,可以得知是 void *类型,即freertos的mbox handle。直接调用 *mbox = xQueueCreate(size , sizeof( void * )); 即可,注意,这时的(*mbox)所指向的内存空间,由xQueueCreate负责动态分配,即交由os管理;
但是,在ucos中,OSQCreate函数并不涉及内存分配的内容,需要用户事先(静态或动态)分配好Queue结构所占用的内存。
看了一些前辈的移植方案,都是采用动态分配内存的,但我猜想原因可能是在lwip以前的版本中,申请mbox的函数是这样的:sys_mbox_t sys_mbox_new(void)
只有返回值,没有输入参数,如果返回结构体的话,可能会导致效率下降,因此采用返回指针的方式,
但lwip1.4.1的申请mbox函数是err_t sys_mbox_new(sys_mbox_t *mbox, int size);
如果将sys_mbox_t定义成这样:
typedef struct _lwipQ {
OS_EVENT *pQ;
void *pQEntries[archMESG_QUEUE_LENGTH];
} lwipQ;
typedef lwipQ sys_mbox_t;
不知道是不是可以避免动态分配内存的问题,而是将该结构直接分配在调用函数的栈中?
没有仔细看过lwip的源码,还望各位前辈多多指点,谢谢大家!
|