买的飞控板到了,开始写下位机的程序了,本来打算用UCOS的,因为以前用过,比较熟悉,可以很快上手,不过板子的卖家推荐了RT-Thread,以前虽然有接触过,但是没用过,于是去官网看了下,感觉还不错。其一这是咱们国人写的,其二USOS有的基本任务调度功能它都有了,其三它的GUI貌似原生支持中文(不确定),其四他有很多的附加组件,虽然这些组建大部分在以前做项目的时候都自己完成过,并且我并不怎么喜欢集成度太高的RTOS,但是这次可以尝试看看。还有它有些好的环形buffer,可以用来做串口的缓冲,哈,这个以前都是自己写的,有现成的,不过试试它带的也好,同时还集成设备管理功能,可以自己写驱动,我看了下,驱动接口都是些类似于winCE的流驱动的接口函数,我们可以把串口放在它的设备管理里面,用它的流驱动接口试一试。不过不知道稳定性怎么样。
既然选定用RT-Thread了,第一步就是下源码,可以去官网网站www.rt-thread.org下载,我下的是RT-Thread1.2.1。下下来后目录如下:
根据编程手册可以知道,目录名 描述
bsp 针对各个具体开发板、平台的目录,其中包含相应的Keil工程文件(如果包含了Keil MDK的移植)
filesystem 包含了RT-Thread的文件系统组件代码
finsh 包含了RT-Thread的finsh shell组件代码
include 包含了RT-Thread核心的头文件
libc 面向GCC移植的小型C库
libcpu 面向各个芯片移植的代码
net 包含了RT-Thread的网络组件代码
rtgui 包含了RT-Thread/GUI图形用户界面组件代码
src 包含了RT-Thread内核核心的代码 说明:上图中的 SI 是我SourceInsight的工程目录,和RTT无关。 这个手册可能挺久没更新了,filesystem 只的就是途中的components。rtgui 已经被单独拿出来了,要单独下载,net 包涵在了components里面了。 下下来的文件包涵了很多的平台,飞控板用的是STM32F407的芯片,所以其他平台的文件全部删掉。在bsp目录下可以找到stm32f40x文件夹,这文件夹里面包括了库函数,其他芯片平台的文件夹统统删掉,在libcpu下,只需要将arm文件夹里面的common和cortex-m4留下来,其他的也都统统删掉。还有其他一些辅助性的文件,如:documentation、examples、tools什么的我们也统统删掉,处理完这些后,一个干净的RTT就准备好了,舒爽很多。 接下来 跑嵌入式里面的第一个例子,hello world啊。。哈哈。。 RTT的项目里面就创建了两个线程,在这两个线程里面单独控制两个LED灯,
1 //------- init led1 thread 2 rt_thread_init(&thread_led1, 3 "led1", 4 rt_thread_entry_led1, 5 RT_NULL, 6 &thread_led1_stack[0], 7 sizeof(thread_led1_stack),11,5); 8 rt_thread_startup(&thread_led1); 9 10 //------- init led2 thread11 rt_thread_init(&thread_led2,12 "led2",13 rt_thread_entry_led2,14 RT_NULL,15 &thread_led2_stack[0],16 sizeof(thread_led2_stack),11,5);17 rt_thread_startup(&thread_led2);
分别找到rt_thread_entry_led1和rt_thread_entry_led2两个函数,在里面控制LED灯就可以了。。
1 static void rt_thread_entry_led1(void* parameter) 2 { 3 4 5 while (1) 6 { 7 rt_thread_delay(RT_TICK_PER_SECOND); 8 GPIO_ResetBits(GPIOE,GPIO_Pin_7); 9 rt_thread_delay(RT_TICK_PER_SECOND/3);10 GPIO_SetBits(GPIOE,GPIO_Pin_7); 11 12 }13 }
另一个进程其实也是一样的,控制得灯不一样而已。。。代码比较粗糙,测试用的。。