UCOSII学习笔记.docx_第1页
UCOSII学习笔记.docx_第2页
UCOSII学习笔记.docx_第3页
UCOSII学习笔记.docx_第4页
UCOSII学习笔记.docx_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/ /学校:成都理工大学 / 系:应用数学系 /专业:应用数字专业。 /日期:2009年3月 /说明:本简要合成程序是uCOS-II提供的EX1_X86 / #include includes.h /* * * CONSTANTS(宏定义) * */ #define TASK_STK_SIZE 512 /* 任务堆栈尺寸512 (单位WORD) */ #define N_TASKS 10 /* 任务数量10(不包括TaskStart()任务) */ /* * * VARIABLES(变量) * */ OS_STK TaskStkN_TASKSTASK_STK_SIZE; /* 10个任务的堆栈区域 */ OS_STK TaskStartStkTASK_STK_SIZE; /* 任务TaskStart()的堆栈 */ char TaskDataN_TASKS; /* 每个任务显示字符存储区域 */ OS_EVENT *RandomSem; /* 信号量 */ /* * * FUNCTION PROTOTYPES * */ void Task(void *data); /* 其余10个任务,这10个任务共用一个函数名称 */ void TaskStart(void *data); /* 起始任务(负责uCOS-II初始化,修改中断向量*/ /* 调用TaskStartCreateTasks()创建其余10个任务*/ /* 然后若检测“ESC”键,则返回MSDOS */ static void TaskStartCreateTasks(void); /* 创建其余10个任务的任务 */ static void TaskStartDispInit(void); /* 界面显示初始化 */ static void TaskStartDisp(void); /* 多任务显示子程序 */ void main (void) PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK); /* 清屏幕 */ OSInit(); /* uC/OS-II初始化 */ /* 包括(1)、初始化任务就绪表 */ /* (2)、初始化任务控制块链表 */ /* (3)、初始化事件表 */ /* (4)、初始化内存管理 */ /* (5)、初始化消息队列 */ /* (6)、初始化空闲任务 */ /* (5)、初始化统计任务 */ PC_DOSSaveReturn(); /* 保存MSDOS环境 */ /* 包括(1)、保存BIOS硬件定时中断向量(0x08)*/ /* (2)、将保留中断号0x81指向硬件定时 */ /* 中断 */ PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-IIs context switch vector */ RandomSem = OSSemCreate(1); /* Random number semaphore */ OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart(); /* Start multitasking */ / /学校:成都理工大学 / 系:应用数学系 /专业:应用数字专业。 /日期:2009年3月 /说明:本简要合成程序是uCOS-II提供的EX1_X86 / #include includes.h /* * * CONSTANTS(宏定义) * */ #define TASK_STK_SIZE 512 /* 任务堆栈尺寸512 (单位WORD) */ #define N_TASKS 10 /* 任务数量10(不包括TaskStart()任务) */ /* * * VARIABLES(变量) * */ OS_STK TaskStkN_TASKSTASK_STK_SIZE; /* 10个任务的堆栈区域 */ OS_STK TaskStartStkTASK_STK_SIZE; /* 任务TaskStart()的堆栈 */ char TaskDataN_TASKS; /* 每个任务显示字符存储区域 */ OS_EVENT *RandomSem; /* 信号量 */ /* * * FUNCTION PROTOTYPES * */ void Task(void *data); /* 其余10个任务,这10个任务共用一个函数名称 */ void TaskStart(void *data); /* 起始任务(负责uCOS-II初始化,修改中断向量*/ /* 调用TaskStartCreateTasks()创建其余10个任务*/ /* 然后若检测“ESC”键,则返回MSDOS */ static void TaskStartCreateTasks(void); /* 创建其余10个任务的任务 */ static void TaskStartDispInit(void); /* 界面显示初始化 */ static void TaskStartDisp(void); /* 多任务显示子程序 */ void main (void) PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK); /* 清屏幕 */ OSInit(); /* uC/OS-II初始化 */ /* 包括(1)、初始化任务就绪表 */ /* (2)、初始化任务控制块链表 */ /* (3)、初始化事件表 */ /* (4)、初始化内存管理 */ /* (5)、初始化消息队列 */ /* (6)、初始化空闲任务 */ /* (5)、初始化统计任务 */ PC_DOSSaveReturn(); /* 保存MSDOS环境 */ /* 包括(1)、保存BIOS硬件定时中断向量(0x08)*/ /* (2)、将保留中断号0x81指向硬件定时 */ /* 中断 */ /- /#define uCOS 0x80 /* Interrupt vector # used for context switch*/ /宏定义uCOS的路径SOFTWAREuCOS-IIIx86LBC45OS_CPU.H(文件中) /- PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-IIs context switch vector */ /* 设置中断号0x80自定义中断服务程序的向量 */ /* 地址指向OSCtxSw,即指向普通任务切换子程序*/ /* 说明:任务切换包括: */ /* (1)、普通任务切换 */ /* (2)、中断任务切换 */ RandomSem = OSSemCreate(1); /* Random number semaphore */ /* 创建一个信号量,保护Borland C+产生的随机*/ /* 数。信号量的作用是防止多个任务同时访问同 */ /* 一个资源 */ OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); /* 创建任务TaskStart */ OSStart(); /* 在就绪表中查找最高优先级的任务号 */ /* 然后调用OSStartHighRdy()执行最高 */ /* 优先级任务 */ /* * * START MULTITASKING(启动多任务操作系统) * * Description: This function is used to start the multitasking process which lets uC/OS-II manages the * task that you have created. Before you can call OSStart(), you MUST have called OSInit() * and you MUST have created at least one task. * 描述 : 当已经调用了OSStart(),则这个函数可以启动多任务操作系统,让uC/OS-II管理你已经创建的任务。 * 前提是你已经调用了OSInit(),并且已经至少创建了一个任务(只需要创建系统提供的空闲任务即可)。 * Arguments : none * 入口参数: 无 * Returns : none * 出口参数: 无 * Note : OSStartHighRdy() MUST: * a) Call OSTaskSwHook() then, * b) Set OSRunning to TRUE. * c) Load the context of the task pointed to by OSTCBHighRdy. * d_ Execute the task. * 注释: OSStartHighRdy()函数执行的动作是: * a) 调用Call OSTaskSwHook(),然后 * b) 设置OSRunningTRUE * c) 根据任务控制块OSTCBHighRdy,作任务切换动作。 * 实际上任务切换的实质: * (1)、从当前任务的私栈中恢复SS:SP * (2)、从当前任务的私栈中恢复AX,BX,CX,DX,SI,DI,BP * (3)、执行IRET,从堆栈中弹出CS:IP * d) 自动跳转到CS:IP处,执行这个最高优先级任务 * OSStartHighRdy()函数的存储路径SOFTWAREuCOS-IIIx86LBC45OS_CPU_A.ASM * */ void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) /* 如果多任务操作系统还没有运行 */ y = OSUnMapTblOSRdyGrp; /* Find highest prioritys task priority number */ x = OSUnMapTblOSRdyTbly; /* 查找优先级最高的任务号 */ OSPrioHighRdy = (INT8U)(y 3) + x); /* 优先级最高的任务号(y 0) /* See if called from ISR . */ /* 如果当前正在执行中断服务程序 */ return (OS_EVENT *)0); /* . cant CREATE from an ISR */ /* 创建失败,返回(OS_EVENT *)0 */ /* 注:中断服务子程序中不能调用创建信号量 */ OS_ENTER_CRITICAL(); /* 关全局中断 */ pevent = OSEventFreeList; /* Get next free event control block */ /* 从空闲事件控制块链表中获得一个事件控制块 */ if (OSEventFreeList != (OS_EVENT *)0) /* See if pool of free ECB pool was empty */ /* 如果获得一个事件控制块成功 */ OSEventFreeList = (OS_EVENT *)OSEventFreeList-OSEventPtr; /* 修正空闲事件控制块链表头指针 ,使它指向 */ /* 下一个空闲控制块 */ OS_EXIT_CRITICAL(); /* 开放全局中断 */ if (pevent != (OS_EVENT *)0) /* 如果获得的事件控制块可用 */ pevent-OSEventType = OS_EVENT_TYPE_SEM; /* 登记事件控制块的类型信号量 */ pevent-OSEventCnt = cnt; /* 信号量的初始值存入申请的事件控制块中 */ pevent-OSEventPtr = (void *)0; /* Unlink from ECB free list */ OS_EventWaitListInit(pevent); /* Initialize to nobody waiting on sem. */ return (pevent); /* * * INITIALIZE A TASKS STACK * * Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the * stack frame of the task being created. This function is highly processor specific. * * Arguments : task is a pointer to the task code * * pdata is a pointer to a user supplied data area that will be passed to the task * when the task first executes. * * ptos is a pointer to the top of stack. It is assumed that ptos points to * a free entry on the task stack. If OS_STK_GROWTH is set to 1 then * ptos will contain the HIGHEST valid address of the stack. Similarly, if * OS_STK_GROWTH is set to 0, the ptos will contains the LOWEST valid address * of the stack. * (指向任务堆栈栈顶的指针,它是指向一个任务堆栈空间 * * opt specifies options that can be used to alter the behavior of OSTaskStkInit(). * (see uCOS_II.H for OS_TASK_OPT_?). * * Returns : Always returns the location of the new top-of-stack once the processor registers have * been placed on the stack in the proper order. * * Note(s) : Interrupts are enabled when your task starts executing. You can change this by setting the * PSW to 0x0002 instead. In this case, interrupts would be disabled upon task startup. The * application code would be responsible for enabling interrupts at the beginning of the task * code. You will need to modify OSTaskIdle() and OSTaskStat() so that they enable * interrupts. Failure to do this will make your system crash! * 初始化任务堆栈 /入口参数: / void (*task)(void *pd)当前任务代码的起始地址 / *pdata 参数指针 / *ptos 当前任务堆栈的栈顶地址 / opt 当前任务的优先级 /出口参数: / 任务堆栈初始化后,新堆栈指针的位置。 * */ / /存储路径C:SOFTWAREuCOS-IIIx86LBC45OS_CPU_C.C / 预备知识:MSDOS操作系统方面的知识: /(1)、MSDOS操作系统堆栈的生长方向:MSDOS堆栈是从下往上(从高端地址往低端地址)生长的。 / / 低端(0x0000) - / | | / - / | | / - / | | / (0xFFFD) - / (0xFFFE) | | -SP / 高端(0xFFFF) - / 系统刚上电时,堆栈指针SP位置 / / 低端(0x0000) - / | | / - / | | / - / | AX |-SP / (0xFFFD) - / (0xFFFE) | | / 高端(0xFFFF) - / 堆栈中压入AX寄存器后,堆栈指针SP位置 / /(2)、MSDOS操作系统存储器中的中断向量区 / / 低端 - / (0x0000) | INT(0)中断服务程序的IP | / - / | INT(0)中断服务程序的CS | / - / (0x0004) | INT(1)中断服务程序的IP | / - / | INT(1)中断服务程序的CS | / - / (4*N) | INT(N)中断服务程序的IP | / - / | INT(N)中断服务程序的CS | / 高端(0xFFFF) - / / /(3)、CALL DEST(段间直接调用指令)的堆栈过程如下: / (a)、(SP)-(SP)2 / (b)、(SP1),(SP)-(CS) / (c)、(SP)-(SP)2 / (d)、(SP1),(SP)-(IP) / (e)、(IP)- DEST指定地址的偏移地址 / (f)、(CS)- DEST指定地址的段移地址 / / - - 低端(0x0000) / | | | | / - - / | | | IP | -SP / - - / | | | CS | / - - / | | -SP | | / - - 高端(0xFFFF) / 执行CALL DEST指令前 执行CALL DEST指令后 / / 说明:执行CALL DEST(段间直接调用指令)时,首先保存返回地址(调用处的地址), / 把返回地址的CS和IP压入堆栈,然后跳转到由DEST指定的地址去执行。 / / /(4)、RET(段间返回指令)堆栈过程如下: / / (a)、(IP)-(SP1),(SP) / (b)、(SP)-(SP)2 / (c)、(CS)-(SP1),(SP) / (d)、(SP)-(SP)2 / / - - 低端(0x0000) / | | | | / - - / | IP | -SP | | / - - / | CS | | | / - - / | | | | -SP / - - 高端(0xFFFF) / / 说明:RET指令放在函数的末尾,它使函数在功能完成后返回调用程序继续执行,而返回地址是 /调用程序调用函数时存放在堆栈中的。 / 因此执行RET(段间返回指令)时(即从函数返回时),从堆栈中依次弹出IP和CS,然后跳转到 /调用处的地址的下条指令位置继续执行 / / /(5)、INT type(软中断指令)堆栈过程如下: / / (a)、(SP)-(SP)2 / (b)、(SP1),(SP)-(PSW) / (c)、(SP)-(SP)2 / (d)、(SP1),(SP)-(CS) / (e)、(SP)-(SP)2 / (f)、(SP1),(SP)-(IP) / (g)、(CS)-(type*42) / (h)、(IP)-(type*4) / (i)、 跳转到CS:IP执行中断服务程序 / / - - 低端(0x0000) / | | | IP | -SP / - - / | | | CS | / - - / | | | PSW | / - - / | | -SP | | / - - 高端(0xFFFF) / 执行INT type指令前 执行INT type指令后 / / 说明:type中断号,范围0255(MSDOS有256个中断源),执行软中断前, /首先把PSW(程序状态字节,相当于AVR单片机的SREG)压入堆栈,然后将返回地址(调用处地址) /CS和IP压入堆栈 / 最后将中断号type的中断服务程序的段地址装入CS、偏移地址装入IP,接着跳转到CS:IP /执行中断号type的中断服务程序。 / / /(5)、IRET(中断返回指令)的堆栈过程如下: / (a)、(IP)-(SP1),(SP) / (b)、(SP)-(SP)2 / (c)、(CS)-(SP1),(SP) / (d)、(SP)-(SP)2 / (e)、(PSW) 弹出程序状态字PSW / (f)、(SP)-(SP)2 / / - -

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论