打印
[uCOS/RTOS]

【连载中】从0-1跟我一起实战入门“RT-Thread_Nano 3.0.3 内核”

[复制链接]
1519|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Fillmore 于 2018-8-30 14:07 编辑

【第2天】MDK下点灯,从0-1跟我一起实战入门“RT-Thread_Nano 3.0.3 内核”
关闭


第一章    MDK下建立工程点个灯

file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif


1.1 、工具准备
file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif

下载 MDK,安装,说明一下 STM32 只两个系列是可以免费使用 MDK 的。下载 Nano,安装具体的过程略过,网上太多了,再写就浪费时间了。

1.2 、建立裸机工程文件
file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif

本节主要介绍如何建立一个没有操作系统的工程,执行一个 while(1)超级循环。高手略过,新手 step by step。
1.2.1 先建立一个文件夹
菜单上选择“Project→New uVision Project...”,如图 1-1 所示,之后弹出图 1-2 文件保存对话框


图 1-1 新建工程

1.2.3保存工程

图 1-2 工程文件保存

1.2.4选择芯片

文件保存之后,进行芯片选择,弹出图 1-3所示界面,芯片先好后,弹出配置界面,如图 1-4所示

图 1-3 选择工程对应的芯片


图 1-4 环境配置界面
1.2.5   环境配置(裸机)



选择“CMIS”下的“CORE”,选择“Device”下的“Startup”,如图 1-5 所示。确定后生成工程,如图 1-6

所示。


图 1-5 选择裸机环境配置

1.2.6  查看文件


图 1-6 生成的工程文件

1.2.7 修改工程结构

生成的那个名字,看着就不爽。如图 1-7 所示,在“Target1”上右键,选择“Manage Project Items...”对工程项目进行管理,组织其结构。弹出 1-8 界面,双击其中的条目进行名字修改。

图 1-7 修 改前修改后


图 1-8 修改过程



1.2.8新建 main.c


图 1-10 新 建txt 文件


图 1-11 新建文件夹

图 1-12 保存 main.c

1.2.9 添加到工程

将文件添加到工程中去,如图 1-13 所示,双击 App 文件夹,弹出添加文件对话框,选择main.c 文件,Add 后关闭。


图 1-13 添加源文件到工程

1.2.10 编写代码




右键插入头文件,不管什么,有就插入进来,这个是 MDK 识别过的,准没有错,空白右键,插入头文件, 如图 1-14 所示。然后编写main函数,如图 1-15所示




图 1-14 插入头文件

图 1-15 main.c 文件代码

1.2.11 编译


图 1-16 编译工程

1.2.12   模拟设置
编译正确没有错误,然后要进行验证,本文为了方便操作,使用模拟运行进行验证。

首先要对调试器进行设置,如图 1-17,点击“选项”,弹出的对话框中,选择“Debug”选项卡,然后选择 “use

Simulator”。


图 1-17 调试器设置

1.2.13   模拟运行



图 1-18 模拟运行

1.2.14 常见的错误解释与说明

到这里裸机的工程就完成了,是不是很简单?比以前在  MDK4 上文件复制来复制去,容易多了,其实这也是软件帮助完成了相关文件的复制(那些可能要修改的文件,才会复制出来)。

基本上在这个阶段不会出错,因为大部分工作都是软件做的,我们只是添加了一个main.c  文件,如果编译出错的话,查看一下语法有没有错。

可能会出错的地方,应改是没有找到对应的芯片,这是由于没有安装对应的库造成的,MDK5 和 MDK4 不同,在

MDK5 上所有的支持包都是通过 pack Installer 来完成的,如图。


图 1-19 支持包的安装与查看
如果没有装的,可以去 www.keil.com/pack上面下载对应的支持包。RT-Thread Nano 在上面也可以下载。

在建立工程时,文件添加错误,或是没有添加文件,怎么办呢?点击运行环境管理器,然后进入设置界面,  重新进行设置。




图 1-20 运行环境管理器的开启

1.3、添加 RT-Thread Nano


1.3.1 添加内核

在运行环境管理器中,定位到 RTOS,选择RT-Thread,注意,本文所使用的是 3.0.3,如果您还在使用 2.1.1, 在后面的示图中会有些不同,为了对比,请确认使用的版本是否一致。


图 1-21 添加 RTOS 内核



添加完内核心后, RT-Thread 内核文件会被工程引用,并复制出 board.c rtconfig.h 等文件, 位于

CRSytem_RTT3\RTE\RTOS\下,如图1-22 所示。


图 1-22 RT-Thread 内核所要改的文件

1.3.2   编写两个任务

为了测试操作系统是否能正常运行起来,添加两个任务,然后通过模拟运行,查看其内部是否可以实现任务切换,  如果有任务来回切换,说明系统已正常运行。

如图 1-23,添加任务代码,并初始化任务。


图 1-23 RTOS 下 的 main.c
1.3.3 main.c 代码

/*----------------------------Begin-------------------------------*/



#include "LPC17xx.h"       // Device  header

#include  "RTE_Components.h" //  Component  selection
#include  "RTE_Device.h"  //  Keil:evice:Startup
#include  <rtthread.h>



static  struct  rt_thread  led0_thread;
static  struct  rt_thread  save_thread; ALIGN(RT_ALIGN_SIZE)

static  rt_uint8_t  rt_led0_thread_stack[1024];
static  rt_uint8_t rt_save_thread_stack[1024];
   static void led0_thread_entry(void* parameter)

{

uint8_t  i  =  0; while(1)

{

i++;

rt_thread_delay(50); //

}

}



static void save_thread_entry(void* parameter)

{

uint8_t j  =  0;


{

j++;

rt_thread_delay(10); //

}

}



while(1)

int main(void)

{

rt_err_t result  =  RT_ERROR;

result  =  rt_thread_init(&led0_thread,  "led0",                                         //
led0_thread_entry,  RT_NULL,                                               //
&rt_led0_thread_stack[0],     //
sizeof(rt_led0_thread_stack),                                                      //

5,    //
20);        //



if (result ==  RT_EOK)

{

rt_thread_startup(&led0_thread);

}

result =  RT_ERROR;

result =  rt_thread_init(&save_thread,  "save",

save_thread_entry,

RT_NULL,                               //
&rt_save_thread_stack[0],                               //
sizeof(rt_save_thread_stack),                               //
4,    //

20);

if (result ==  RT_EOK)

{

rt_thread_startup(&save_thread);

}

return 0;

}



/*-----------------------------END----------------------------------*/

1.3.4   编译与仿真

添加两个断点,可以看到两个任务来回切换,并明显看到 save 这个任务先执行,说明优先级越小,优先级越高。


图 1-24 RT-Thread 模拟运行
1.4、说好的点个灯呢?

RT-Thread 好像有个叫 PIN 什么的,对于引脚控制,代码越多效率越低,直接写寄存器的效率是比较高的, 但是对人的要求也比较高,调用库文件中的函数效率也不会差到哪去,通常我们都会使用现成的参考代码

(没有?上网找去!MDK 里面也有很多例子,打开看去!)。
1.4.1  添加一个 GPIO 控制函数


图 1-25 点个灯
1.4.2 仿真


图 1-26 仿 真

1.4.3 那个监视窗口在哪里?


图 1-27 GPIO 口状态查看

下一章预告:
第二章  Finsh Shell

连载中请下拉查看

今天没办法再上传图片了,头疼...... 今天在RTThread物联网操作系统公众号上面看到一篇不错的**,也是关于点灯的 推荐一下:https://mp.weixin.qq.com/s?__biz=MzIwMzA2NzI1Ng==&mid=2655155652&idx=1&sn=c682b27db11c3c0ef44d16e1c7c10623&chksm=8d63cfd3ba1446c5142cb038100d5c87d6eea44ede0a77871b6eca3e1cce72f72148f4ef00e1&token=93511689&lang=zh_CN#rd

5.jpg (104.82 KB )

5.jpg

4.jpg (65.46 KB )

4.jpg

3.png (25.74 KB )

3.png

相关帖子

沙发
Fillmore|  楼主 | 2018-8-17 18:37 | 只看该作者
算了...下次发博客吧

使用特权

评论回复
板凳
Fillmore|  楼主 | 2018-8-27 17:43 | 只看该作者
一次只能更新20张图片 明天再见啦

使用特权

评论回复
地板
Fillmore|  楼主 | 2018-8-28 11:06 | 只看该作者
图片更新完毕,终于可以接下一章了

使用特权

评论回复
5
Fillmore|  楼主 | 2018-8-30 15:11 | 只看该作者
本帖最后由 Fillmore 于 2018-9-29 17:54 编辑

第二章  Finsh Shell
在搞 Finsh Shell 之前先要搞定一个串口通讯,至少要保证能收数据能发数据。
2.1    串口
file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
由于使用的是 LPC1768,直接参考一下 BSP 下的 LPC176x 工程的写法,之前我在网上看教程,都是从 STM32 讲起的,更可笑的是,我在做串口程序的时候,是从STM32 的串口程序改过来的。。。好浪费时间呀。。。当时参考 “RT thread 设备驱动组件之 USART 设备”这个文档做的,前人种树,后人乘凉呀。现在知道学习方法了没有?先去看一下  BSP  里面有没有对应的例程序,有的话,直接参考。不懂了再看网上相关的**,之前俺的学习路线出了点差错,不过还好,跑起来了。
现在,我们在前一节的基础上,添加 UART
2.1.1 初识串口
先来看一下 uart.c 这个文件里面都有什么鬼,定义了一个结构体,几个函数,如图2-1 所示。

2-1 uart.c 结构图
注意了,以前总是说 static  定义的函数只能内部使用,外部不能用呢??什么鬼??实际上是错误的,之前也做过实验,通过指针的方法是可以访问的,可能应当改写成“static 定义的函数,不能直接被外部的文件显式调用,指针方法可以调用”。
串口 0 各函数的作用如表 2-1 所示,其中 rt_hw_uart_init 函数是供外部调用的初始化函数,它主要任务是完成设备接口函数的绑定,并将设备注册,如图2-2 所示。

  
函数名
  
  
说明
  
  
UART0_IRQHandler
  
  
串口 0 的中断函数,接收数据到缓冲区
  
  
rt_uart_init
  
  
串口 0 的初始化函数
  
  
rt_uart_open
  
  
串口 0 的打开函数,开中断
  
  
rt_uart_close
  
  
串口 0 的关闭函数,关中断
  
  
rt_uart_read
  
  
串口 0 的读取函数,从缓冲区读取数据
  
  
rt_uart_write
  
  
串口 0 的发送函数
  
  
rt_hw_uart_init
  
  
将以上函数与设备结构体绑定,并注册
  
2-1 串口 0 各函数的作用



2-2 串口初始化函数
首先定义了一个结构体指针 uart,这个指针指向实体 uart_device,然后对实体进行赋值,其中那个parent 就是rt_device,这个取的名字也很讨厌,为什么不直接写成device 这样的名字呢?可以自己改的,嘿嘿, 我也懒得去改,知道是它就成。最后一句,注册到 RTT。注意了,这里只是小学生刚来注册报名登记而已,  什么事情都还没有干,相当于还没有安排座位(真正的初始化),还无法开始听课(数据读取和写入操作)。
再说一下那个结构体是怎么回事吧。
struct rt_uart_lpc
{
struct rt_device  parent;
/*  buffer  for  reception */ rt_uint8_t  read_index,  save_index;
rt_uint8_t  rx_buffer[RT_UART_RX_BUFFER_SIZE];
} uart_device;
rt_device    这个是系统定义好的结构体,用户需要自定义设备结构体时,都从这个地方去扩展,把它放到最前面是为了方面取地址和强制内型转换使用(强制转换会不会把数给弄坏了?以前我也这样想。我们换一个思路来看这个  问题,那个东东原原本本在那里,我们用一个相机拍个照(读取数据),照片是有参考坐标的,不同的坐标读取不  同的值,在上面画上网格,格子大小不同,读取的数据就会不同,但是原有的数据不会变,除非你写入。)
2.2     添加串口文件
在工程目录下建立一个文件夹 Drivers,并将 LPC176x 下的 uart.c uart.h 复制过来,然后在工程添加 Drivers目录,将uart.c 添加进去。如图 2-3 中的 1 所示。然后添加头文件的目录,如图 2-3 中的 2 3 操作,将头文件目
录包含进来,如图 2-4 所示。

图2-3 添加 uart.c/添加头文件包含目录



2-4 添加 uart.c/添加头文件包含目录



注意一下,44 行,这里对两个宏进行了判断,只有打开了这两个开关,下面的代码才参考编译呢。



2-5编译条件

2.3    打开串口支持
查找一下那两个宏定义在什么地方,悲剧的是,RT_USING_UART0个宏没有定义的地方,另一个宏在rt_config.h 里面有,但是长相不好看呢。先看一新旧配置文件的对比图吧,如图 2-6、2-7 所示。





没有那个 Device 选择的地方了,怎么办,看一下里面都写了什么,如图 2-7 所示。RTE_USING_DEVICE 也没有找到定义呢,要用怎么办?手动添加吧。


图 2-7 配置文件信息

编译,出错了哦,NND,这个 Nano 3 改进得怎么这么不人性化呢?看一下是什么?说是没有定义






怎么办?继续添加,参考一下以前的代码,定义是这个样子的:






至为什么呢?我也不知道,没有看文档,用 PP 想一下,那个定义之后有 64 个字节,从键盘输入超过 64 个字节的将会是什么指令呢?哥都不让它这么多输入,浪费老子空间。最后配置文件如图 2-8 所示。

图 2-8 手动修改配文件

再编译,没有错误了。接下来要添加 Finsh Shell 了。


担心图片存储空间不够,今天就更新到这里啦 明天继续明天见
大家也可以加入论坛交流群,交流讨论








使用特权

评论回复
6
Fillmore|  楼主 | 2018-8-31 18:42 | 只看该作者
本帖最后由 Fillmore 于 2018-10-22 12:09 编辑

今天继续昨天的章节
2.4     Finsh Shell 支持


2-9 添 加 Finsh Shell
编译,没有错误哦。

2.5     检查一下
查找一下初始化函数,如图 2-10 所示。坑货,怎么没有调用呀?

图 2-10 查找一下调用情况

注意,编译没有错误,并不代码程序执行没有错误,不然怎么会出现  BUG 呢?编译成功只能说明,语法没有问题,符合编译器的逻辑。
2.6     Shell 使用 uart0

file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif

输出口选择设备“uart0”,注意了,这里的 uart0 不是指 LPC 上的串口 0,指的是名字为 uart0 的那个设备。所以,不要以为只能是串口哦,别的接口,可能也是可以用的,当然,我没有试过,机会留给大家。

图 2-11 选择 uart0 进行输出

下周再见~





二维码.jpg (179.29 KB )

二维码.jpg

2-12.png (19.72 KB )

2-12.png

使用特权

评论回复
7
Fillmore|  楼主 | 2018-9-29 17:56 | 只看该作者
这样会不会太长了 我开个新帖?

使用特权

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

本版积分规则

64

主题

144

帖子

0

粉丝