打印

四轴飞行器 Matlab 姿态显示

[复制链接]
6069|91
手机看帖
扫描二维码
随时随地手机跟帖
沙发
gaoyang9992006|  楼主 | 2017-3-8 21:22 | 只看该作者
RT-Thread 环境搭建板子的卖家推荐了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灯,


//------- init led1 thread
    rt_thread_init(&thread_led1,
                   "led1",
                   rt_thread_entry_led1,
                   RT_NULL,
                   &thread_led1_stack[0],
                   sizeof(thread_led1_stack),11,5);
    rt_thread_startup(&thread_led1);

    //------- init led2 thread
    rt_thread_init(&thread_led2,
                   "led2",
                   rt_thread_entry_led2,
                   RT_NULL,
                   &thread_led2_stack[0],
                   sizeof(thread_led2_stack),11,5);
rt_thread_startup(&thread_led2);
分别找到rt_thread_entry_led1和rt_thread_entry_led2两个函数,在里面控制LED灯就可以了。
static void rt_thread_entry_led1(void* parameter)
{


    while (1)
    {
        rt_thread_delay(RT_TICK_PER_SECOND);
        GPIO_ResetBits(GPIOE,GPIO_Pin_7);
        rt_thread_delay(RT_TICK_PER_SECOND/3);
        GPIO_SetBits(GPIOE,GPIO_Pin_7);   
        
    }
}




使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2017-3-8 21:26 | 只看该作者
RT-Thread 串口本来是打算说根据RT-Thread的设备管理提供的驱动接口些串口驱动的,但是仔细一看,我去,串口驱动写好了,只需要调用就可以了。下面我们说说具体怎么使用的。
      首先在rt_hw_board_init()函数里面有个rt_hw_usart_init(),这个就是串口初始化的函数了,而且RTT已经写好了三个串口的初始化,只需要修改下宏定义就可以使用,RTT实在用心良苦啊,这都帮我们写好了。
      个人的一点看法,可能不是很全面,能力有限。其实我对函数rt_hw_usart_init()的名字有点异议,我觉得应该写成rt_hw_mcu_usart_init(),为什么呢?没错,我们一般会把系统框架从底层到上层分为 硬件层、驱动层、系统层和应用层,但是在硬件层中我以前做项目的时候会更加细分一下,这样可以方便以后的移植,怎么说呢,我会把它具体分为IO口部分这是硬件层最底层的,然后再分为MCU设备部分,MCU设备部分就包括MCU自带的硬件模块(串口,IIC,SPI,DCMI,SDIO,DMA,定时器等等)。IO口部分是定义各IO口的连接的设备。这样在系统中就会有一个最底层的文件叫做Pindefs.h,用来定义IO口,然后就是MCU部分的各自带设备的驱动。之后才是驱动层,如果只直接操作IO口的驱动可以直接调用Pindefs.h,如果是通过MCU的设备(串口,IIC,SPI)操作外围器件,驱动可以调用MCU部分的驱动。之所以把MCU设备部分放在硬件层而不是驱动层我是这样考虑的,很简单,驱动层调用MCU设备部分对外围设备进行操作,MCU设备部分比驱动层第一级,所以放在硬件层了,也比较好理解。然后将驱动层和硬件层统一划为BSP层,也就是班级支持包层。这样细分之后的好处就是当更改板子布局,改变IO口功能的时候,只需要改变Pindefs.h就完成了移植,如果更换了MCU,只需要更换MCU设备部分的代码,可以提高系统的灵活性,而且代码重用率也可以很高,用过一个MCU后,以后用这款MCU大部分代码就都可以重用了。
        接下来讲正事,在rt_hw_usart_init() 函数里面,可以看到通过三个宏定义进行预编译,需要用哪个就定义对应的宏定义,RTT就会对对应的串口进行初始化了,宏定义如下:
1 #define RT_USING_UART12 #define RT_USING_UART2
3 #define RT_USING_UART3
宏定义在 Board.h里面,呵呵,我又觉得这个名字是mcu.h对我来说会更习惯些。。
宏定义好了,然后串口怎么输出数据呢?在RTT里面调用设备驱动的接口函数rt_device_write就可以实现串口的打印了,具体我们以控RTT的控制台应用(finsh)为例进行下说明。

在rt_hw_usart_init() 下面有个函数
1 #ifdef RT_USING_CONSOLE
2     rt_console_set_device(CONSOLE_DEVICE);
3 #endif
这是个控制台初始化函数,关于CONSOLE_DEVICE 有在Board.h 里面有如下定义,意思就是定义控制台通过哪个串口和外界通讯,我们板子是窗口1,所以#define STM32_CONSOLE_USART      1 ,同时RT_USING_CONSOLE 预编译宏定义一定要记得打开。
#define STM32_CONSOLE_USART      1
#if STM32_CONSOLE_USART == 0
#define CONSOLE_DEVICE "no"
#elif STM32_CONSOLE_USART == 1
#define CONSOLE_DEVICE "uart1"
#elif STM32_CONSOLE_USART == 2
#define CONSOLE_DEVICE "uart2"
#elif STM32_CONSOLE_USART == 3
#define CONSOLE_DEVICE "uart3"
#endif
这个控制台是怎么用的呢?主要是通过rt_kprintf函数调用的,类似于VC中的printf函数,printf通过电脑屏幕显示,rt_kprintf是通过串口打印出来,在电脑装个串口调试助手就可以显示出来了。在rt_kprintf函数中可以看到函数 rt_device_write(_console_device, 0, rt_log_buf, length); 其中_console_device就是在之前rt_console_set_device设定好的串口对应的设备的句柄(暂时称之为句柄),调用rt_device_write数据就通过串口发出去了。

在rtthread_startup函数中调用了rt_show_version(),用来现实RTT版本信息,rt_show_version() 里面调用的是rt_kprintf函数输出的信息。



可以清楚的看到版本信息,这里我们打开了finsh的功能,可以方便调试,里面调用了两个命令,list和list_thread命令,具体可以看 RTT的手册。




使用特权

评论回复
地板
gaoyang9992006|  楼主 | 2017-3-8 21:27 | 只看该作者

使用特权

评论回复
5
yuanlu20082002| | 2017-4-6 14:42 | 只看该作者
学习

使用特权

评论回复
6
minDragon| | 2017-4-23 23:21 | 只看该作者
喵喵

使用特权

评论回复
7
qiuyi1| | 2017-5-9 11:14 | 只看该作者
学习了。。。

使用特权

评论回复
8
gaoyang9992006|  楼主 | 2017-5-9 16:43 | 只看该作者

一起学习。

使用特权

评论回复
9
bamaxingfu12| | 2017-5-10 13:43 | 只看该作者
看看,谢谢!

使用特权

评论回复
10
岁月神偷李| | 2017-5-12 15:15 | 只看该作者
学习

使用特权

评论回复
11
wx6588303| | 2017-5-22 18:56 | 只看该作者
看一看

使用特权

评论回复
12
sbxk67| | 2017-5-22 20:44 | 只看该作者
本帖最后由 cooldog123pp 于 2022-8-21 11:07 编辑

?????????????????????????????多谢楼主分享!

使用特权

评论回复
13
hechun123| | 2017-5-23 13:35 | 只看该作者
奥术大师多

使用特权

评论回复
14
shen_hao| | 2017-5-27 17:26 | 只看该作者
我回复点什么呢

使用特权

评论回复
15
ngkyou| | 2017-5-27 17:47 | 只看该作者
本帖最后由 cooldog123pp 于 2022-8-21 11:07 编辑

感谢楼主!

使用特权

评论回复
16
yf820625| | 2017-6-14 20:07 | 只看该作者
本帖最后由 cooldog123pp 于 2022-8-21 11:08 编辑

感谢楼主!

使用特权

评论回复
17
wings409| | 2017-6-16 16:59 | 只看该作者
这片论坛都被你承包了吧

使用特权

评论回复
18
ufofhb| | 2017-6-22 15:41 | 只看该作者
学习一下 看看

使用特权

评论回复
19
ufofhb| | 2017-6-22 15:41 | 只看该作者
看看  学习一下

使用特权

评论回复
20
江边飞鸟| | 2017-7-20 20:50 | 只看该作者
司马婉仪

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1951

主题

15890

帖子

207

粉丝