uCOSIII(一)

作者:SunnyFHY    发布于:

UCOSIII学习

前言

学了一年单片机,从51到tm4以及stm32,基本都是在while(1)里面“裸奔”。18年暑假的时候突然想玩一下操作系统,就操作了一下。原来有一个官方移植的tm4c1294例程。本来是想改一改移植到tm4c123g上然后用ccs作为开发环境,研究了一天发现micrium官方对于tiva-c系列只提供了IAR和realview开发工具的startup.c。我猜直接把ccs的startup_ccs.c换掉realview的或许可以吧。不过我的首要目的是学单片机上操作系统的原理和使用方法,所以就直接用官方移植的例程上手了。

基于tm4c1294的UCOSIII系统搭建

官方例程下载

1.进入micrium官网

国外网站打开有点慢,等个半分钟到一分钟就行。

https://www.micrium.com/

1538641804364

2.点击导航栏的Downloads进入下载页面

下拉页面找到根据MCU生产商浏览,找到Texas Instrument。

1538642099029

3.选中tm4c1294进入下载界面

1538642588422

4.直接点击资源这一栏

值得注意的是micrium提供的keil MDK是v4,所以导入到v5会有警告提示,管它呢。反正最后不影响使用就是了。

1538642688315

5.登录账号并下载

注册一个micrium账号,Log in to Download

1538643022452

文件结构解析

文件夹初探

文件夹解压出来如下

1538643201614

第一个EvalBoards就是MCU板子移植的相关代码

我们要找的keil工程文件在EvalBoards->TI->EK-TM4C1294XL->OS3->KeilMDK这条路径下。

在OS3那一层并列一个”BSP”的文件夹,这是micrium写的tm4c1294板子驱动的相关代码。不过我采用的是tiva-ware,这个BSP驱动后续可能只用一部分,不然会重定义然后打架。

1538643385032

剩下三个就是UCOSIII的资源文件

这部分详细介绍参考《嵌入式实时操作系统uCOS-3》(北航出版社)。

uC-CPU

文件结构如下

\uC-CPU

​ \cpu_core.c(包含适用所有CPU架构的C代码 包含用来测量中断关闭时间的函数)

​ \cpu_core.h(包含用于测量中断关闭时间的变量定义)

​ \cpu_def.h(包含uC/CPU模块使用的宏定义)

​ \ARM-Cortex-M4\RealView

​ \cpu.h(包含一些数据类型定义)

​ \cpu_a.asm(汇编语言实现开关中断、计算前导零、使能缓存、建立MPUs、MMU的函数,其中函数可以直接在C代码里调用)

​ \cpu_c.c(基于特定cpu架构的代码)

uC-LIB

可移植库函数如下

\lib_ascii.c及其头文件(其中函数可以替代大小字母转化和数字字母互化的库函数)

\lib_def.h(定义许多常量)

\lib_math.c及其头文件(其中函数可以替代rand()、srand())

\lib_mem.c及其头文件(其中函数可以替代memclr()、memset()、memcpy()、memcmp())等

lib_str.c及其头文件(其中函数可以以替代strlen()、strcpy()、strcmp())等

uCOS-III

其中与处理器类型无关文件如下

\Source

​ \os_cfg.app.c(根据os_cfg_app.h中宏定义定义变量和数据)

​ \os_core.c(包含uCOSIII内核功能模块)

​ \os_dbg.c(包含内核调试器)

​ \os_flag.c(包含事件标志管理代码)

​ \os_int.c(包含中断处理任务代码)

​ \os_mem.c(包含存储分区代码)

​ \os_msg.c(包含消息处理代码)

​ \os_mutex.c(包含互斥信号量代码)

​ \os_pend.multi.c(包含允许任务同时等待多个信号量和多个消息队列代码)

​ \os_prio.c(用于追踪已就绪任务)

​ \os_q.c(包含消息队列管理代码)

​ \os_sem.c(包含信号量管理代码)

​ \os_stat.c(包含统计任务代码)

​ \os_task.c(包含任务的管理代码)

​ \os_tick.c(包含可管理正在延时和超时等待任务)

​ \os_time.c(包含延时代码)

\os_tmr.c(包含软件定时器代码)

​ \os_var.c(包含uCOSIII的全局变量)

​ \os.h(uCOSIII主要头文件)

​ \os_type.h(包含数据类型声明)

keil环境配置

在第一次导入工程的时候一般会提示识别到器件为tm4c1294,直接按提示下支持包就行。

器件型号为TM4C1294NCPDT。

我记得只要器件型号对上了,其他配置在这个例程下基本都是配好的。

只需要在魔术棒的C/C++选项卡把Preprocessor Symbols的Define填上 rvmdk PART_TM4C1294NCPDT 就行。1538653394096

如果出现什么问题,参照以下文档配置keil下的tm4开发环境:

https://wenku.baidu.com/view/6d23b80dbc64783e0912a21614791711cc7979f4.html

tiva-ware联动

tiva-ware是一个ti的软件开发包,里面有bsp板级支持以及tiva-c系列各型号开发板的库函数和例程。

在keil里面使用tiva-ware只需要将tiva-ware包里面针对realview开发工具的driverlib.lib添入工程就行。

顺便在魔术棒的C/C++选项卡里的 Include Paths一栏加入你的tiva-ware包的路径。

1538653571710

第一个UCOSIII工程

下好例程,配好环境,来试试水

软件设计如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include "app_cfg.h"
#include <cpu_core.h>
#include <os.h>
#include "..\bsp\bsp.h"
#include "..\bsp\bsp_led.h"
#include "..\bsp\bsp_sys.h"
#include "..\bsp\bsp_misc.h"
#include <lib_ascii.h>
#include <lib_math.h>
#include <lib_mem.h>
#include <lib_str.h>
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#define START_TASK_PRIO 3
#define START_STK_SIZE 128
OS_TCB StartTaskTCB;
CPU_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *p_arg);
#define TASK1_TASK_PRIO 4
#define TASK1_STK_SIZE 128
OS_TCB Task1_TaskTCB
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);
#define TASK2_TASK_PRIO 5
#define TASK2_STK_SIZE 128
OS_TCB Task2_TaskTCB;
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
void task2_task(void *p_arg);
int main (void)
{
OS_ERR err;
CPU_SR_ALLOC(); /* Disable all interrupts.*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
{
}
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_4);
OSInit(&err); /* Init uC/OS-III. */
OS_CRITICAL_ENTER();
OSTaskCreate((OS_TCB * )&StartTaskTCB,
(CPU_CHAR * )"start task",
(OS_TASK_PTR )start_task,
(void * )0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK * )&START_TASK_STK[0],
(CPU_STK_SIZE)START_STK_SIZE/10,
(CPU_STK_SIZE)START_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
(OS_ERR * )&err);
OS_CRITICAL_EXIT();
OSStart(&err);
while (1)
{
}
}
void start_task(void *p_arg)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
OS_ERR err;
CPU_SR_ALLOC();
(void)&p_arg;
BSP_Init(); /* Initialize BSP functions */
cpu_clk_freq = BSP_SysClkFreqGet(); /* Determine SysTick reference freq.*/
cnts = cpu_clk_freq /* Determine nbr SysTick increments*/
/ (CPU_INT32U)OSCfg_TickRate_Hz;
OS_CPU_SysTickInit(cnts);
CPU_Init();
OS_CRITICAL_ENTER();
OSTaskCreate((OS_TCB * )&Task1_TaskTCB,
(CPU_CHAR * )"Task1 task",
(OS_TASK_PTR )task1_task,
(void * )0,
(OS_PRIO )TASK1_TASK_PRIO,
(CPU_STK * )&TASK1_TASK_STK[0],
(CPU_STK_SIZE)TASK1_STK_SIZE/10,
(CPU_STK_SIZE)TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
(OS_ERR * )&err);
OSTaskCreate((OS_TCB * )&Task2_TaskTCB,
(CPU_CHAR * )"task2 task",
(OS_TASK_PTR )task2_task,
(void * )0,
(OS_PRIO )TASK2_TASK_PRIO,
(CPU_STK * )&TASK2_TASK_STK[0],
(CPU_STK_SIZE)TASK2_STK_SIZE/10,
(CPU_STK_SIZE)TASK2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
(OS_ERR * )&err);
OS_CRITICAL_EXIT();
OSTaskDel((OS_TCB*)0,&err);
}
void task1_task(void *p_arg)
{
CPU_INT08U task1_num=0;
CPU_INT32U ui32Loop1;
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
OS_CRITICAL_ENTER();
OS_CRITICAL_EXIT();
while(1)
{
task1_num++;
//BSP_LED_Toggle(1);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
for(ui32Loop1 = 0; ui32Loop1 < 20000; ui32Loop1++)
{
}
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0x0);
for(ui32Loop1 = 0; ui32Loop1 < 20000; ui32Loop1++)
{
}
if(task1_num==5)
{
OSTaskDel((OS_TCB*)&Task2_TaskTCB,&err);
}
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
void task2_task(void *p_arg)
{
CPU_INT08U task2_num=0;
CPU_INT32U ui32Loop;
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
OS_CRITICAL_ENTER();
OS_CRITICAL_EXIT();
while(1)
{
task2_num++;
//BSP_LED_Toggle(2);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_PIN_0);
for(ui32Loop = 0; ui32Loop < 20000; ui32Loop++)
{
}
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0x0);
for(ui32Loop = 0; ui32Loop < 20000; ui32Loop++)
{
}
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
}
}

下载现象为:任务一运行5次后删掉任务二。所以可以看到本来是两个led几乎同时闪烁,闪烁4次后,有一个led停止闪烁,另一个继续闪烁。

至此,你就在tm4c1294上拥有了一个基于tiva-ware固件库可以跑的uCOSIII。

format_list_numbered

(无)

  1. 1. UCOSIII学习
    1. 1.1. 前言
    2. 1.2. 基于tm4c1294的UCOSIII系统搭建
      1. 1.2.1. 官方例程下载
      2. 1.2.2. 1.进入micrium官网
      3. 1.2.3. 2.点击导航栏的Downloads进入下载页面
      4. 1.2.4. 3.选中tm4c1294进入下载界面
      5. 1.2.5. 4.直接点击资源这一栏
      6. 1.2.6. 5.登录账号并下载
      7. 1.2.7. 文件结构解析
        1. 1.2.7.1. 文件夹初探
          1. 1.2.7.1.1. 第一个EvalBoards就是MCU板子移植的相关代码
          2. 1.2.7.1.2. 剩下三个就是UCOSIII的资源文件
      8. 1.2.8. keil环境配置
      9. 1.2.9. tiva-ware联动
    3. 1.3. 第一个UCOSIII工程
vertical_align_top

Copyright © 2017 SunnyFHY

Powered by Hexo & Theme - Vateral