概述
嵌入式操作体系μC/OS-II是一个揭露源代码的占先式多使命的微内核RTOS,其特色能够归纳为以下几个方面:揭露源代码,代码结构明晰、明晰,注释翔实,安排有条理,可移植性好,可裁剪,可固化。内核归于抢占式,最多能够办理60个使命。现在国内对μC/OS-II的研讨和运用都许多。只需买一本书就可取得源代码,对校园和教育的运用彻底免费,商业运用的费用相对也很低。所以对μC/OS-II实时操作体系的学习研讨、开发、运用具有重要意义。
大部分的μC/OS-II代码是运用ANSI C言语书写的,因而μC/OS-II的可移植性好,但是仍需求运用C和汇编言语写一些处理器相关代码。μC/OS-II的移植需求满意以下要求:
(1)处理器的C编译器能够发生可重入代码;
(2)能够运用C调用进入和退出临界区代码;
(3)处理器有必要支撑硬件中止,并且需求一个守时中止源;
(4)处理器需求能够包容必定数据的硬件仓库;
(5)处理器需求有能够在CPU寄存器与内核和仓库交流数据的指令。
依据ARM7的S3C44B0X处理器彻底满意上述要求。它运用ARM公司的16位/32位RISC结构,内核是arm7TDMI,作业在66MHz,片上集成了以下部件:8K Cache、外部存储器控制器、LCD控制器、4个DMA通道、2个UART、1个多主I2C总线控制器、1个I2C总线控制器,以及5通道PWM守时器和1个内部守时器、8通道12位ADC等,能够与常用的外围设备完结无缝衔接,功用强大。现在,国内运用较为广泛。
1内核的移植
μC/OS-II的移植只需求修正与处理器相关的代码就能够了。详细有如下内容:
(1)os_cpu.h中需求设置一个常量来标识仓库增加方向;
(2)os_cpu.h中需求声明几个用于开关中止和使命切换的宏;
(3)os_cpu.h中需求针对详细处理器的字长从头界说一系列数据类型;
(4)os_cpu_a.asm需求改写4个汇编言语的函数;
(5)os_cpu_c.c需求用c言语编写6个简略函数;
(6)修正主头文件include.h,将上面的三个文件和其他自己的头文件参加。
完结上述作业后,μC/OS-II就能够运转在arm处理器上了。
2 LwIP的移植
μC/OS-II自身没有TCP/IP协议栈,现在的一些第三方TCP/IP支撑都是彻底商业化的,很少给出源代码,影响了μC/OS-II的研讨和推行。通过把开放源代码的TCP/IP协议栈LwIP移植到μC/OS-II上来,就取得了一套可免费研讨、学习的嵌入式网络软件渠道。
2.1 Lwip的操作体系封装层(operating system.emulation layer)
Lwip为了习惯不同的操作体系,在代码中没有运用和某一个操作体系相关的体系调用和数据结构。而是在lwip和操作体系之间增加了一个操作体系封装层。操作体系封装层为操作体系服务(守时,进程同步,音讯传递)供给了一个一致的接口。在lwip中进程同步运用semaphone和音讯传递选用”mbox”。操作体系封装层的原代码在…/lwip/src/core/sys.c中。而和详细的操作体系相关的代码在../lwip/src /arch/sys_arch.c中。
操作体系封装层的首要函数如下:
void sys_init(void)//体系初始化
sys_thread_t sys_thread_new(void (* function)(void *arg), void *arg,int prio)//创立一个新进程
sys_mbox_t sys_mbox_new(void)//创立一个邮箱
void sys_mbox_free(sys_mbox_t mbox)//开释并删去一个邮箱
void sys_mbox_post(sys_mbox_t mbox, void *data) //发送一个音讯到邮箱
void sys_mbox_fetch(sys_mbox_t mbox, void **msg)//等候邮箱中的音讯
sys_sem_t sys_sem_new(u8_t count)//创立一个信号量
void sys_sem_free(sys_sem_t sem)//开释并删去一个信号量
void sys_sem_signal(sys_sem_t sem)//发送一个信号量
void sys_sem_wait(sys_sem_t sem)//等候一个信号量
void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)//设置一个超时事情
void sys_untimeout(sys_timeout_handler h, void *arg)//删去一个超时事情
…
关于操作体系封装层的信息能够阅览lwip的doc目录下面的sys_arch.txt.文件。
2.2 Lwip在μC/OS-II上的移植.
2.2.1 体系初始化sys_int()
sys_int有必要在tcpip协议栈使命tcpip_thread创立前被调用。
2.2.2 创立一个和tcp/ip相关新进程sys_thread_new()
lwip中的进程便是μC/OS-II中的使命,留意宏LWIP_STK_SIZE是tcp/ip相关使命的仓库巨细,能够依据状况自己设置,我设置成10*1024,由于44b0X开发板上有8M的sdram;而宏LWIP_TASK_MAX是tcp/ip相关的使命最多数目;LWIP_START_PRIO 是tcp/ip相关使命的开始优先级,tcpip_thread在所有tcp/ip相关进程中应该是优先级最高的;别的tcpip_thread应该是最早创立的。
2.2.3 Lwip中的守时事情
在tcp/ip协议中许多时分都要用到守时,守时的完结也是tcp/ip协议栈中一个重要的部分。 LwIP中每个与外界网络衔接的线程都有自己的timeout特点,即等候超时时刻。这个特点表现为每个线程都对应一个sys_timeout结构体行列,包含这个线程的timeout时刻长度,以及超时后应调用的timeout函数,该函数会做一些开释衔接,收回资源的作业。假如一个线程对应的 sys_timeout为空(NULL),阐明该线程对衔接做永久的等候。timeout结构体已经由LwIP自己在sys.h中界说好了,并且对结构体行列的数据操作也由LwIP担任,咱们所要完结的是如下函数:
struct sys_timeouts * sys_arch_timeouts(void)
这个函数的功用是回来现在正处于运转态的线程所对应的timeout行列指针。timeout行列归于线程的特点,因而是OS相关的函数,只能由用户完结。
2.2.4 “mbox”的完结:
LwIP运用音讯行列来缓冲、传递数据报文,因而要在sys_arch中完结音讯行列结构sys_mbox_t,以及相应的操作函数:
sys_mbox_new() //创立一个音讯行列
sys_mbox_free() //开释一个音讯行列
sys_mbox_post() //向音讯行列发送音讯
sys_arch_mbox_fetch() //从音讯行列中获取音讯