5. µC/OS-II应用实例.

Slides:



Advertisements
Similar presentations
专利申请 简介 专利申请的种类 专利申请的途径、费用 申请文件 材料学院 刘科高 博士/教授          
Advertisements

第一章 C语言概述 计算机公共教学部.
劳动统计专业年报培训 社会科 洪惠娟 2009年11月.
嵌入式系统概论 —基于32位微处理器与实时操作系统 第五讲实时操作系统C/OS-Ⅱ分析 北京航空航天大学 机器人研究所 魏洪兴.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
第2章 高级编程的硬件基础 主要内容 计算机硬件组成 80x86微机系统 Turbo C编译方式 BIOS和DOS调用.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
Hadoop I/O By ShiChaojie.
嵌入式系统课程简介 宋健建 南京大学软件学院 2004/02/10.
嵌入式系统及应用.
STRUCTURE 授課:ANT 日期:2010/5/12.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
嵌入式操作系统ucOS-II分析.
NO.3.1 SOPC技术 第5章 Nios II 系统的外围设备.
SVN服务器的搭建(Windows) 柳峰
嵌入式系统及应用.
UCOS -II的使用 撰写:李湧 2006-06-29.
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
走进编程 程序的顺序结构(二).
辅导课程六.
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
大数据管理技术 --NoSQL数据库 HBase 陈 辉 大数据分析技术.
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
移植μC/OS-Ⅱ.
嵌入式系统 —嵌入式实时操作系统C/OS-Ⅱ分析 2006年5月.
第48组:姜立群(SC ) 谭兆路(SC ) 闫 佼(SC )
第五讲 C/OS-Ⅱ移植分析和系统初始化
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
ΜC/OSⅡ中的任务调度 Group01小组 柴永锋 李逢春 苗 冬.
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 北京航空航天大学 智能嵌入式技术工作室 王田苗 魏洪兴.
計數式重複敘述 for 迴圈 P
Gzip编译及调试 曹益华
Struct結構 迴圈
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
三:基于Eclipse的集成开发环境搭建与使用
3. µC/OS-II内核 2019/4/11.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
微机系统的组成.
程式結構&語法.
LEGO 講義3 1. Hitechnic 紅外線sensor介紹 2. Hitechnic 顏色sensor介紹
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
Platform Builder使用介绍 WINCE系统应用开发流程说明 ACTION RDC 杨 涛 2005.Dec.3th
Introduction to the C Programming Language
6. 面向任务程序设计(TOP).
Ch6. uC/OS-II分析 宋健建 南京大学软件学院.
Introduction to the C Programming Language
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第二章 Java基本语法 讲师:复凡.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
Python 环境搭建 基于Anaconda和VSCode.
第七章  数 组.
第十二章 位运算.
第六章 S3C2410的串口UART及编程 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)
单片机应用技术 (C语言版) 第4章 C51程序设计入门
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
隨機函數.
Presentation transcript:

5. µC/OS-II应用实例

第五章 µC/OS-II应用实例 Borland C++ 5.02与实例一 实例二 实例三 实例四

5.1 Borland C++ 5.02与实例一 使用计算机作为硬件平台,借助Borland C++ 5.02和TASM5.0(Borland Turbo Assembler 5.0)软件,实现µC/OS-II的四个实例,其中实例一和实例二直接取自《µC/OS-II原理与ARM应用程序设计》一书 。

5.1p01 在Borland C++上实现实例一(1)

5.1p02 在Borland C++上实现实例一(2)

5.1p03 在Borland C++上实现实例一(3)

5.1p04 在Borland C++上实现实例一(4) 子目录名 包括的文件名 文件来源 bsp pc.c和pc.h 《嵌入式实时操作系统µC/OS-II(第2版)》一书附带光盘 config os_cfg.h Micrium-uCOS-II-V286.ZIP app_cfg.h 新建文本文件 ports os_cpu.h,os_cpu_a.asm和os_cpu_c.c ucosii os_core.c,os_dbg.c,os_flag.c,os_mbox.c,os_mem.c,os_mutex.c,os_q.c,os_sem.c,os_task.c,os_time.c,os_tmr.c,ucos_ii.c和ucos_ii.h ucpu — object user ex5_1.c和includes.h

5.1p05 在Borland C++上实现实例一(5)

5.1p06 在Borland C++上实现实例一(6)

5.1p07 在Borland C++上实现实例一(7)

5.1p08 在Borland C++上实现实例一(8)

5.1p09 在Borland C++上实现实例一(9)

5.1q01 实例一编译与运行(1)

5.1q02 实例一编译与运行(2) 将pc.c文件中的TRUE改为OS_TRUE,FALSE改为OS_FALSE 在文件os_cpu.h的末尾添加如下的函数声明: void OSCtxSw(void); void OSTickISR(void); void OSStartHighRdy(void); void OSIntCtxSw(void);

5.1q03 实例一编译与运行(3)

5.1q04 实例一编译与运行(4)

5.1q05 实例一编译与运行(5)

5.1q06 实例一编译与运行(6)

5.1q07 实例一编译与运行(7)

5.1q08 实例一编译与运行(8)

5.1r01 实例一程序解释 实例一工程中需要编写的文件主要是ex5_1.c,位于“D:\xtucosii\ex5_1\user”目录下,下面将该文件分三部分解释,即变量与声明部分、主函数与主任务体以及其他的任务体。

5.1r02 ex5_1.c文件中的常量、变量与声明部分 1 #include "includes.h" 2 3 #define TASK_STK_SIZE 512 4 #define N_TASKS 10 5 6 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; 7 OS_STK TaskStartStk[TASK_STK_SIZE]; 8 char TaskData[N_TASKS]; 9 OS_EVENT *RandomSem; 10 11 void Task(void *data); 12 void TaskStart(void *data); 13 static void TaskStartCreateTasks(void); 14 static void TaskStartDispInit(void); 15 static void TaskStartDisp(void);

5.1r03 头文件includes.h 1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 #include <stdlib.h> 5 #include <conio.h> 6 #include <dos.h> 7 #include <setjmp.h> 8 9 #include "os_cpu.h" 10 #include "os_cfg.h" 11 #include "ucos_ii.h" 12 #include "pc.h"

5.1r04 main函数和TaskStart函数(1) 1 void main (void) 2 { 3 PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); 4 5 OSInit(); 6 7 PC_DOSSaveReturn(); 8 PC_VectSet(uCOS, OSCtxSw); 9 10 RandomSem = OSSemCreate(1); 11 12 OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); 13 OSStart(); 14 }

5.1r05 main函数和TaskStart函数(2) 16 void TaskStart (void *pdata) 17 { 18 #if OS_CRITICAL_METHOD == 3 19 OS_CPU_SR cpu_sr; 20 #endif 21 //char s[100]; 22 INT16S key; 23 24 25 pdata = pdata; 26 27 TaskStartDispInit();

5.1r06 main函数和TaskStart函数(3) 29 OS_ENTER_CRITICAL(); 30 PC_VectSet(0x08, OSTickISR); 31 PC_SetTickRate(OS_TICKS_PER_SEC); 32 OS_EXIT_CRITICAL(); 33 34 OSStatInit(); 35 36 TaskStartCreateTasks();

5.1r07 main函数和TaskStart函数(4) 38 for (;;) { 39 TaskStartDisp(); 40 41 42 if (PC_GetKey(&key) == OS_TRUE) { 43 if (key == 0x1B) { 44 PC_DOSReturn(); 45 } 46 } 47 48 OSCtxSwCtr = 0; 49 OSTimeDlyHMSM(0, 0, 1, 0); 50 } 51 }

5.1r08 文件ex5_1.c中其他函数(1) 1 static void TaskStartDispInit (void) 2 { 3 PC_DispStr(0,0,"uC/OS-II,TheReal-Time Kernel",DISP_FGND_WHITE+DISP_BGND_RED+ DISP_BLINK); 4 PC_DispStr( 0, 1, " Jean J. Labrosse ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 5 PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 6 PC_DispStr( 0, 3, " EXAMPLE #1 ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 7 PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 8 PC_DispStr( 0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 9 PC_DispStr( 0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 10 PC_DispStr( 0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 11 PC_DispStr( 0, 8, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 12 PC_DispStr( 0, 9, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 13 PC_DispStr( 0, 10, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 14 PC_DispStr( 0, 11, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 15 PC_DispStr( 0, 12, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 16 PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

5.1r09 文件ex5_1.c中其他函数(2) 17 PC_DispStr( 0, 14, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 18 PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 19 PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 20 PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 21 PC_DispStr( 0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 22 PC_DispStr( 0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 23 PC_DispStr( 0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 24 PC_DispStr( 0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 25 PC_DispStr(0, 22, "#Tasks: CPU Usage: %", DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY); 26 PC_DispStr(0,23," #Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 27 PC_DispStr( 0, 24, " <-PRESS 'ESC' TO QUIT-> ",DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY+DISP_BLINK); 28 }

5.1r10 文件ex5_1.c中其他函数(3) 30 static void TaskStartDisp (void) 31 { 32 char s[80]; 33 34 35 sprintf(s, "%5d", OSTaskCtr); 36 PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 37 38 #if OS_TASK_STAT_EN > 0 39 sprintf(s, "%3d", OSCPUUsage); 40 PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 41 #endif

5.1r11 文件ex5_1.c中其他函数(4) 43 sprintf(s, "%5d", OSCtxSwCtr); 44 PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 45 46 sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); 47 PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 48 49 switch (_8087) { 50 case 0: 51 PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE); 52 break; 53 54 case 1: 55 PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); 56 break;

5.1r12 文件ex5_1.c中其他函数(5) 58 case 2: 59 PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); 60 break; 61 62 case 3: 63 PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); 64 break; 65 } 66 }

5.1r13 文件ex5_1.c中其他函数(6) 68 static void TaskStartCreateTasks (void) 69 { 70 INT8U i; 71 72 73 for (i = 0; i < N_TASKS; i++) { 74 TaskData[i] = '0' + i; 75 OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], i + 1); 76 } 77 }

5.1r14 文件ex5_1.c中其他函数(7) 79 void Task (void *pdata) 80 { 81 INT8U x; 82 INT8U y; 83 INT8U err; 84 85 86 for (;;) { 87 OSSemPend(RandomSem, 0, &err); 88 x = random(80); 89 y = random(16); 90 OSSemPost(RandomSem); 91 92 PC_DispChar(x, y + 5, *(char *)pdata, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 93 OSTimeDly(1); 94 } 95 }

5.1s01 µC/OS-View与实例一(1)

5.1s02 µC/OS-View与实例一(2)

5.1s03 µC/OS-View与实例一(3)

5.1s04 µC/OS-View与实例一(4)

5.1t01 工程ex5_1v修改与运行(1) “D:\xtucosii\ex5_1v\user”目录下的文件includes.h中添加以下包括文件,即 #include "os_viewc.h" #include "os_view.h"

5.1t02 工程ex5_1v修改与运行(2) D:\xtucosii\ex5_1v\ports”目录下的文件os_cpu_c.c中的三个函数作如下修改,即: 1 void OSTaskCreateHook (OS_TCB *ptcb) 2 { 3 OSView_TaskCreateHook(ptcb); 4 } 5 6 void OSTaskSwHook (void) 7 { 8 OSView_TaskSwHook(); 9 } 10 11 void OSTimeTickHook (void) 12 { 13 OSView_TickHook(); 14 }

5.1t03 工程ex5_1v修改与运行(3) 修改目录“D:\xtucosii\ex5_1v\user”下的文件ex5_1v.c中的main函数和TaskStartCreateTasks函数,即使用OSTaskCreateExt函数创建任务,并为每个任务命名,修改后的函数如下: 1 void main (void) 2 { 3 INT8U err; 4 5 PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);

5.1t04 工程ex5_1v修改与运行(3) 7 OSInit(); 8 9 PC_DOSSaveReturn(); 10 PC_VectSet(uCOS, OSCtxSw); 11 12 RandomSem = OSSemCreate(1); 13 14 OSTaskCreateExt(TaskStart, 15 (void *)0, 16 &TaskStartStk[TASK_STK_SIZE - 1], 17 0, 18 0, 19 &TaskStartStk[0], 20 TASK_STK_SIZE, 21 (void *)0, 22 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 23 OSTaskNameSet(0,"Task0",&err); 24 OSStart(); 25 }

5.1t05 工程ex5_1v修改与运行(3) 27 static void TaskStartCreateTasks (void) 28 { 29 INT8U i; 30 INT8U err; 31 INT8U strName[16];

5.1t06 工程ex5_1v修改与运行(3) 34 for (i = 0; i < N_TASKS; i++) { 35 TaskData[i] = '0' + i; 36 OSTaskCreateExt(Task, 37 (void *)&TaskData[i], 38 &TaskStk[i][TASK_STK_SIZE - 1], 39 i + 1, 40 i + 1, 41 &TaskStk[i][0], 42 TASK_STK_SIZE, 43 (void *)0, 44 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 45 sprintf(strName,"Task%d",i+1); 46 OSTaskNameSet(i + 1,strName,&err); 47 } 48 }

5.1t07 工程ex5_1v修改与运行(4) 文件ex5_1v.c的函数TaskStart中代码“OSStatInit();”后添加代码“OSView_Init();”,即加入初始化µC/OS-View的代码,这个函数将调用OSView_InitOS函数创建一个为µC/OS-View服务的任务OSView_Task,优先级号为OS_VIEW_TASK_PRIO。

5.1t08 工程ex5_1v修改与运行(5) 去掉目录“D:\xtucosii\ex5_1v”下所有文件的只读属性。

5.1t09 工程ex5_1v修改与运行(6) 设置工程选项“Project Options|Directories”为: Include为:c:\bc5\include; d:\xtucosii\ex5_1v\user; d:\xtucosii\ex5_1v\ucosii; d:\xtucosii\ ex5_1v\ports; d:\xtucosii\ex5_1v\bsp; d:\xtucosii\ex5_1v\ucview; d:\xtucosii\ex5_1v\config; Source为:d:\xtucosii\ex5_1v\user; d:\xtucosii\ex5_1v\ucosii; d:\xtucosii\ex5_1v\ports; d:\ xtucosii\ex5_1v\bsp; d:\xtucosii\ex5_1v\ucview; Intermediate和Final均为D:\xtucosii\ex5_1v\object。

5.1t10 工程ex5_1v修改与运行(7) 目录“D:\xtucosii\ex5_1v\ucview\”下的文件os_view.h中添加如下宏定义: #define OS_VIEW_MODULE 1 #define OS_VIEW_PARSE_TASK 1 #define OS_VIEW_TASK_STK_SIZE 128 #define OS_VIEW_TASK_PRIO 38 #define OS_VIEW_TASK_ID 38

5.1t11 工程ex5_1v修改与运行(8) 修改os_view.c文件中的函数OSView_TxStoINT32U和OSView_TxStoPtr,如下: 1 static void OSView_TxStoINT32U (INT32U tx_data) 2 { 3 OSView_TxStoINT16U((INT16U)(tx_data >> 16)); 4 OSView_TxStoINT16U((INT16U)(tx_data & 0x0000FFFFL)); 5 }

5.1t12 工程ex5_1v修改与运行(8) 8 static void OSView_TxStoPtr (void *ptr) 9 { 10 INT32U tx_data; 11 12 13 tx_data = (INT32U)ptr; 14 OSView_TxStoINT16U((INT16U)(tx_data >> 16)); 15 OSView_TxStoINT16U((INT16U)(tx_data & 0x0000FFFFL)); 16 }

5.1t13 工程ex5_1v修改与运行(8) 修改os_view.c文件中的函数OSView_Init(位于第127行),将其参数“INT32U baud_rate”改为void,即“void OSView_Init (void)”;然后,该函数的最后一行(文件中第150行)的语句改为:“OSView_InitTarget();”,即去掉其参数。

5.1t14 工程ex5_1v修改与运行(9) 修改os_view.h中函数OSView_Init和OSView_InitTarget的声明(位于文件中第72行和第85行)如下 void OSView_Init(void); void OSView_InitTarget(void);

5.1t15 工程ex5_1v修改与运行(10) 修改os_viewc.c中的函数OSView_CfgPort的第一个参数,由“INT16U baud”改为“INT32U baud”,位于文件中第83行和第470行。

5.1t16 工程ex5_1v修改与运行(11) 将os_view.c文件中的函数OSView_TickHook和OSView_TimeGetCycles删掉或注释掉,位于该文件中的第312~360行。

5.1t17 VSPD6软件

5.1t18 工程ex5_1v执行结果

5.1t19 上位机软件µC/OS-View 3.10g实时跟踪工程ex5_1v运行情况

5.2 实例二 实例二将进一步介绍如何动态检查µC/OS-II程序中每个任务的堆栈使用情况

5.2p01 工程ex5_2

5.2p02 工程ex5_2执行情况

5.2q01 任务函数体Task1(1) 1 void Task1 (void *pdata) 2 { 3 INT8U err; 4 OS_STK_DATA data; 5 INT16U time; 6 INT8U i; 7 char s[80]; 8 9 pdata = pdata;

5.2q02 任务函数体Task1(2) 10 for (;;) { 11 for (i = 0; i < 7; i++) { 12 PC_ElapsedStart(); 13 err = OSTaskStkChk(TASK_START_PRIO + i, &data); 14 time = PC_ElapsedStop(); 15 if (err == OS_ERR_NONE) { 16 sprintf(s, "%4ld %4ld %4ld %6d", 17 data.OSFree + data.OSUsed, 18 data.OSFree, 19 data.OSUsed, 20 time); 21 PC_DispStr(19, 12 + i, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 22 } 23 } 24 OSTimeDlyHMSM(0, 0, 0, 100); 25 } 26 }

5.2q03 任务函数体TaskClk 1 void TaskClk (void *data) 2 { 3 char s[40]; 4 5 data = data; 6 for (;;) { 7 PC_GetDateTime(s); 8 PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); 9 OSTimeDly(OS_TICKS_PER_SEC); 10 } 11 }

5.2q04 任务函数体Task4 1 void Task4 (void *data) 2 { 3 char txmsg; 4 INT8U err; 5 6 data = data; 7 txmsg = 'A'; 8 for (;;) { 9 OSMboxPost(TxMbox, (void *)&txmsg); 10 OSMboxPend(AckMbox, 0, &err); 11 txmsg++; 12 if (txmsg == 'Z') { 13 txmsg = 'A'; 14 } 15 } 16 }

5.2q05 任务函数体Task5 19 void Task5 (void *data) 20 { 21 char *rxmsg; 22 INT8U err; 23 24 data = data; 25 for (;;) { 26 rxmsg = (char *)OSMboxPend(TxMbox, 0, &err); 27 PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW + DISP_BGND_BLUE); 28 OSTimeDlyHMSM(0, 0, 1, 0); 29 OSMboxPost(AckMbox, (void *)1); 30 } 31 }

5.2q06 任务Task4和Task5执行流程

5.3 实例三 实例三主要介绍任务控制块扩展数据结构的使用方法以及各种钩子函数的使用方法

5.3p01 工程ex5_3执行情况

5.3q01 钩子函数OSTaskSwHook 1 void OSTaskSwHook (void) 2 { 3 INT16U time; 4 TASK_USER_DATA *puser; 5 6 time = PC_ElapsedStop(); 7 PC_ElapsedStart(); 8 puser = OSTCBCur->OSTCBExtPtr; 9 if (puser != (TASK_USER_DATA *)0) { 10 puser->TaskCtr++; 11 puser->TaskExecTime = time; 12 puser->TaskTotExecTime += time; 13 } 14 }

5.3q02 修正时间后的钩子函数OSTaskSwHook(1) 1 void OSTaskSwHook (void) 2 { 3 static BOOLEAN isNotFirstRun=OS_FALSE; 4 INT16U time; 5 TASK_USER_DATA *puser; 6 7 if(isNotFirstRun) 8 time = PC_ElapsedStop(); 9 PC_ElapsedStart();

5.3q03 修正时间后的钩子函数OSTaskSwHook(2) 10 if(isNotFirstRun) 11 { 12 puser = OSTCBCur->OSTCBExtPtr; 13 if (puser != (TASK_USER_DATA *)0) { 14 puser->TaskCtr++; 15 puser->TaskExecTime = time; 16 puser->TaskTotExecTime += time; 17 } 18 } 19 else 20 { 21 isNotFirstRun=OS_TRUE; 22 } 23 }

5.3q04 钩子函数OSTaskStatHook(1) 1 void OSTaskStatHook (void) 2 { 3 char s[80]; 4 INT8U i; 5 INT32U total; 6 INT8U pct; 7 8 total = 0L; 9 for (i = 0; i < 7; i++) { 10 total += TaskUserData[i].TaskTotExecTime; 11 DispTaskStat(i); 12 }

5.3q05 钩子函数OSTaskStatHook(2) 13 if (total > 0) { 14 for (i = 0; i < 7; i++) { 15 pct = (INT8U)(100 * TaskUserData[i].TaskTotExecTime / total); 16 sprintf(s, "%3d %%", pct); 17 PC_DispStr(62, i + 11, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 18 } 19 } 20 if (total > 1000000000L) { 21 for (i = 0; i < 7; i++) { 22 TaskUserData[i].TaskTotExecTime = 0L; 23 } 24 } 25 }

5.4 实例四 实例四直接使用硬件浮点数协处理器,而不像其他三个实例使用仿真协处理器,因此,在调用OSTaskCreateExt函数时,最后一个参数应使用OS_TASK_OPT_SAVE_FP,表示将对硬件浮点数协处理器相关的寄存器进行保护,即伴随着任务环境进行相关的入栈和出栈操作。

5.4p01 工程ex5_4

5.4p02 工程ex5_4创建向导

5.4p03 工程ex5_4执行情况

5.4q01 Task函数(1) 1 void Task (void *pdata) 2 { 3 FP32 x; 4 FP32 y; 5 FP32 angle; 6 FP32 radians; 7 char s[81]; 8 INT8U ypos; 9 10 ypos = *(INT8U *)pdata + 7; 11 angle = (FP32)(*(INT8U *)pdata) * (FP32)36.0; 12 for (;;) { 13 radians = (FP32)2.0 * (FP32)3.141592 * angle / (FP32)360.0; 14 x = cos(radians); 15 y = sin(radians);

5.4q02 Task函数(2) 16 sprintf(s, " %2d %8.3f %8.3f %8.3f", *(INT8U *)pdata, angle, x, y); 17 PC_DispStr(0, ypos, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 18 if (angle >= (FP32)360.0) { 19 angle = (FP32)0.0; 20 } else { 21 angle += (FP32)0.01; 22 } 23 OSTimeDly(1); 24 } 25 }

需要掌握的知识点 四个实例的创建与运行 掌握任务的创建与工作原理 设计一个应用程序,每2秒自动产生一个16位的随机整数,将其转化为格雷码显示。 注:假设二进制码为c[i],0≤i<16,产生的格雷码记为d[k],0≤k<16,则d[i]=c[i]⊕c[i+1],0≤i<16,c[16]=0。