首页 ucos程序范例 (20页)

ucos程序范例 (20页)

举报
开通vip

ucos程序范例 (20页)ucos程序范例ucos程序范例篇一:第8章基于ucos-ii的程序设计实例第八章基于μCOS-II的程序设计实例8.1实例介绍为了使读者对μCOS-II操作系统有更深的理解,本章将介绍一个在STM32F103处理器平台上使用μCOS-II实时操作系统的程序设计实例。此实例使用英倍特公司提供的STM103V100评估板来实现一个简易温度计。该实例使用STM103V100评估板自带的高灵敏度数字温度传感器来传送温度数据,根据实际采样周期的需要,安排了四种不同的采样方式。采样的条件和周期可以通过键盘输...

ucos程序范例 (20页)
ucos程序范例ucos程序范例篇一:第8章基于ucos-ii的程序设计实例第八章基于μCOS-II的程序设计实例8.1实例介绍为了使读者对μCOS-II操作系统有更深的理解,本章将介绍一个在STM32F103处理器平台上使用μCOS-II实时操作系统的程序设计实例。此实例使用英倍特公司提供的STM103V100评估板来实现一个简易温度计。该实例使用STM103V100评估板自带的高灵敏度数字温度传感器来传送温度数据,根据实际采样周期的需要,安排了四种不同的采样方式。采样的条件和周期可以通过键盘输入进行调节,采样得到的结果可以在评估板的液晶屏上同步显示,并通过串口将采样所得的结果送到上位机。关于STM103V100评估板的更多内容超出本 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 范围,请读者参阅其它相关资料。8.2实例分析本节主要分析如何通过基于实时操作系统编程的方法实现整个系统的所有功能。下面的内容将从任务划分开始,详细说明任务分析的过程。8.2.1实例任务划分为了更合理的将整个系统划分为不同任务,首先要明确一个好的实时系统应具备那些特点,即任务划分的基本原则是什么。一般说来,任务划分的基本原则有以下几点:?满足系统“实时性”:一般使用μCOS-II的嵌入式应用系统,对于响应时间要求很高,如果实时性得不到满足,系统会出现错误甚至导致难以挽回的故障。因此在任务划分时,保证系统实时性是首要原则。?较少资源需求:多个任务协同运转,依靠操作系统的调度策略。任务之间的同步,任务之间的通信,内存管理都需要消耗系统资源。所以在任务划分时,尽量将使用同类资源的应用归入同一任务中,以减少操作系统调度时所消耗的资源。?合理的任务数:同一系统,任务划分的数目越多,每个任务的功能越简单,实现越容易,但任务数目的增多,加大了操作系统的调度负担,资源开销也随之加大;相反,如果任务划分的数目太少,会增加每个任务的复杂性,使任务设计难度加大。最极端的情况,当系统任务数目减少到1时,也就失去了使用多任务操作系统的意义。对一个具体的嵌入式应用系统进行任务划分时,可以有不同的任务划分 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。常用的任·11·务划分方法有:以硬件模块为对象划分任务、以实时性优先原则划分任务和切分耗时任务等。所谓“以硬件模块为对象划分任务”就是根据系统需求,以硬件模块相关驱动为基础,根据硬件驱动在系统中的关键性设定优先级的任务划分方法;“实现性优先原则划分任务”即,将对实时性要求较高的应用划分为单独任务,并赋予较高的优先级来保证整个系统实时性的要求;而“切分耗时任务”的任务划分方法,顾名思义就是将一些占用大量CPU处理时间的繁琐应用从系统中分离出来,作为一个优先级较低的任务在系统空闲时运行。根据上述任务划分的原则和方法,本实例被划分为7个任务:包括4个采用任务,1个负责和用户交互的键盘任务,1个显示任务和1个向上位机传送数据的串口发送任务。其中,4个采样任务分别使用不同的采样条件:延时采样、使用系统时钟节拍采样、定时中断采样和使用高优先级中断的采样。键盘任务除负责接收用户输入并做出反馈外,还需要完成操作系统和系统资源的初始化,包括系统中用到的消息队列、邮箱和互斥信号量的创建等。因为按键任务是第一个启动的用户任务,所以目标板的初始化也由该任务完成。8.2.2实例任务设计与优先级分配完成系统任务划分后,需要对任务的优先级进行设定。任务优先级分配是否合理,直接影响到系统的实时性和可靠性。对任务优先级的安排一般遵循以下原则:?外设相关任务安排高优先级:因为外设任务直接与中断服务程序相对应,如果外设任务优先级低,当需要中断处理时,系统资源可能被高优先级任务占用,而导致中断丢失;?根据任务实现功能的重要性安排优先级:一般情况下,任务越重要优先级越高;?占用关键资源的任务优先级尽量高:只有保证占用关键资源的任务优先运行,才能使其尽早释放资源,以便其它任务运行;?对于周期性任务,执行周期越短的任务,优先级应越高,以保证其得到及时运行;?当以上条件相近时,耗时越短的任务优先级应越高。这样可以缩短其它就绪任务的延时时间。根据以上优先级安排原则,系统中存在的4个采样任务实现同样功能且均为一次性任务。所以,4个任务的优先级应一致。但在μCOS-II操作系统中,同一优先级不允许存在多个任务,所以将4个采样任务的优先级依次排列,因为它们不可能同时发生,则对于应用来说,4个任务的优先级是一致的。键盘任务是系统运行的第一个任务,负责与用户交互。根据优先级安排原则,将其优先级定为7个任务中的中等级别,设为15。显示任务负责将采集的数据显示在LED屏上,它由采样任务触发。根据优先级安排原则,将其优先级定为7个任务中的最低优先级,设为17。系统中任务的优先级安排如下程序清单所示,voidTask_FastSamp(void*pdata);//使用高优先级中断的采样,优先级5voidTask_HookSamp(void*pdata);//使用钩子函数的采样任务,优先级6voidTask_TimerSamp(void*pdata);//使用定时中断的采用任务,优先级7voidTask_DelaySamp(void*pdata);//使用延时函数的采用任务,优先级8voidTask_Send(void*pdata);//串口发送任务,优先级13·12·voidTask_Key(void*pdata);//键盘任务,优先级15voidTask_Disply(void*pdata);//显示任务,优先级17程序运行过程中,当系统 检测 工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训 到键盘输入后,根据采样周期的设定值而创建一个采样任务和串口发送任务Task_Send()。4个采样任务Task_FastSamp(),Task_HookSamp(),Task_TimerSamp(),Task_DelaySamp()和串口发送任务Task_Send()均为一次性任务,且在任务完成后自动删除。Task_Disply()为消息队列驱动的任务,根据消息队列传送的内容进行不同的显示操作。Task_Key()是周期性执行的任务,不断检测键盘输入,并根据检测结果,做出不同的响应。键盘任务是系统运行的第一个任务,负责系统初始化和其它任务的创建。该任务运行后,接收用户输入并根据接收到的输入值启动不同的采样任务。同时,将接收到的输入值通过消息队列的形式发送到显示任务。显示任务负责显示用户输入的参数值和采样任务采样得到的数据。串口发送任务在键盘任务检测到发送操作按键确定时创建。该任务负责从全局采样数组中读取数据并使用中断方式发送到上位机。全局采样数组是系统初始化时建立的FIFO缓存,通过互斥信号量保护。4个采样任务均在键盘接收到用户输入后创建,不同的采样任务使用不同的采样方式进行采样,并将采样所得数据保存在全局FIFO缓存中。所有采样任务在采样过程中的工作就是检测什么时候采样结束,并且负责将采样所得的数据进行处理。处理完毕后,发送消息通知显示任务,最后删除自己本身。8.3任务实现详解开始程序设计之前,首先了解一下主函数。在主函数中,进行了操作系统的初始化,创建了一个键盘任务,然后,启动多任务操作系统。主程序代码如下:intmain(void){OSTaskCreateExt(Task_Key,//任务指针·13·Tmr_TickInit();//操作系统Tick初始化OSInit();/*初始化OS*/Bsp_Init();//系统外设初始化PWM_IoConfiguration();//初始化系统时钟#if(OS_TASK_NAME_SIZE>=16)INT8Uerr;#endif(void*)0,(OS_STK*)&InitTaskStk[OS_INIT_TASK_STACK_SIZE-1],}OSStart();return(0);/*启动多任务环境*/OS_TASK_KEY_PRIO,//任务优先级OS_TASK_KEY_PRIO,(OS_STK*)&InitTaskStk[0],OS_INIT_TASK_STACK_SIZE,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);#if(OS_TASK_NAME_SIZE>=16)OSTaskNameSet(OS_TASK_IDLE_PRIO,(INT8U*)"Idletask",&err);OSTaskNameSet(OS_TASK_INIT_PRIO,(INT8U*)"Inittask",&err);#endif从程序中可以看到,当执行OSStart()后,主函数返回,但了解了ucos-II操作系统后,可以知道这个“return0”的语句是不可能执行的。在主函数中创建了一个键盘任务Task_Key(),其优先级为15,负责初始化目标板和根据用户输入创建其他任务。8.3.1键盘任务键盘任务的主要工作就是周期性扫描键盘,优先级为15。其程序流程图如图8.1所示。·14·图8.1键盘任务程序流程图程序中,首先进行目标板初始化,目标板初始化过程请参见《STM32F103处理器内部资源C编程与实例》一章讲解。之所以将目标的初始化放在第一个任务里,是为了保证该初始化在OSStart()执行后完成。值得注意的是,与采样任务相关的A/D转换初始化也放在了这里,这是因为4个采样任务都用到了A/D转换,放在键盘任务中一次完成,避免了在每个采样任务中单独初始化而带来的代码冗余。接下来创建显示任务Task_Disp(),屏幕初始化工作放在该任务中完成。最后创建了任务轮转不可或缺的一些操作系统资源,包括一个互斥信号量Sem,一个邮箱MyMbox和一个消息队列ReMsgQeue,其中消息队列中消息数目定义为10。按键处理是这个键盘任务的关键,这个键盘任务中状态转移情况如 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 8.1所示。表8.1键盘状态转移表·15·篇二:【精品】第8章基于ucosii的程序设计实例第八章基于μCOS-II的程序设计实例8.1实例介绍为了使读者对μCOS-II操作系统有更深的理解,本章将介绍一个在STM32F103处理器平台上使用μCOS-II实时操作系统的程序设计实例。此实例使用英倍特公司提供的STM103V100评估板来实现一个简易温度计。该实例使用STM103V100评估板自带的高灵敏度数字温度传感器来传送温度数据,根据实际采样周期的需要,安排了四种不同的采样方式。采样的条件和周期可以通过键盘输入进行调节,采样得到的结果可以在评估板的液晶屏上同步显示,并通过串口将采样所得的结果送到上位机。关于STM103V100评估板的更多内容超出本书范围,请读者参阅其它相关资料。8.2实例分析本节主要分析如何通过基于实时操作系统编程的方法实现整个系统的所有功能。下面的内容将从任务划分开始,详细说明任务分析的过程。8.2.1实例任务划分为了更合理的将整个系统划分为不同任务,首先要明确一个好的实时系统应具备那些特点,即任务划分的基本原则是什么。一般说来,任务划分的基本原则有以下几点:?满足系统“实时性”:一般使用μCOS-II的嵌入式应用系统,对于响应时间要求很高,如果实时性得不到满足,系统会出现错误甚至导致难以挽回的故障。因此在任务划分时,保证系统实时性是首要原则。?较少资源需求:多个任务协同运转,依靠操作系统的调度策略。任务之间的同步,任务之间的通信,内存管理都需要消耗系统资源。所以在任务划分时,尽量将使用同类资源的应用归入同一任务中,以减少操作系统调度时所消耗的资源。?合理的任务数:同一系统,任务划分的数目越多,每个任务的功能越简单,实现越容易,但任务数目的增多,加大了操作系统的调度负担,资源开销也随之加大;相反,如果任务划分的数目太少,会增加每个任务的复杂性,使任务设计难度加大。最极端的情况,当系统任务数目减少到1时,也就失去了使用多任务操作系统的意义。对一个具体的嵌入式应用系统进行任务划分时,可以有不同的任务划分方案。常用的任·11·务划分方法有:以硬件模块为对象划分任务、以实时性优先原则划分任务和切分耗时任务等。所谓“以硬件模块为对象划分任务”就是根据系统需求,以硬件模块相关驱动为基础,根据硬件驱动在系统中的关键性设定优先级的任务划分方法;“实现性优先原则划分任务”即,将对实时性要求较高的应用划分为单独任务,并赋予较高的优先级来保证整个系统实时性的要求;而“切分耗时任务”的任务划分方法,顾名思义就是将一些占用大量CPU处理时间的繁琐应用从系统中分离出来,作为一个优先级较低的任务在系统空闲时运行。根据上述任务划分的原则和方法,本实例被划分为7个任务:包括4个采用任务,1个负责和用户交互的键盘任务,1个显示任务和1个向上位机传送数据的串口发送任务。其中,4个采样任务分别使用不同的采样条件:延时采样、使用系统时钟节拍采样、定时中断采样和使用高优先级中断的采样。键盘任务除负责接收用户输入并做出反馈外,还需要完成操作系统和系统资源的初始化,包括系统中用到的消息队列、邮箱和互斥信号量的创建等。因为按键任务是第一个启动的用户任务,所以目标板的初始化也由该任务完成。8.2.2实例任务设计与优先级分配完成系统任务划分后,需要对任务的优先级进行设定。任务优先级分配是否合理,直接影响到系统的实时性和可靠性。对任务优先级的安排一般遵循以下原则:?外设相关任务安排高优先级:因为外设任务直接与中断服务程序相对应,如果外设任务优先级低,当需要中断处理时,系统资源可能被高优先级任务占用,而导致中断丢失;?根据任务实现功能的重要性安排优先级:一般情况下,任务越重要优先级越高;?占用关键资源的任务优先级尽量高:只有保证占用关键资源的任务优先运行,才能使其尽早释放资源,以便其它任务运行;?对于周期性任务,执行周期越短的任务,优先级应越高,以保证其得到及时运行;?当以上条件相近时,耗时越短的任务优先级应越高。这样可以缩短其它就绪任务的延时时间。根据以上优先级安排原则,系统中存在的4个采样任务实现同样功能且均为一次性任务。所以,4个任务的优先级应一致。但在μCOS-II操作系统中,同一优先级不允许存在多个任务,所以将4个采样任务的优先级依次排列,因为它们不可能同时发生,则对于应用来说,4个任务的优先级是一致的。键盘任务是系统运行的第一个任务,负责与用户交互。根据优先级安排原则,将其优先级定为7个任务中的中等级别,设为15。显示任务负责将采集的数据显示在LED屏上,它由采样任务触发。根据优先级安排原则,将其优先级定为7个任务中的最低优先级,设为17。系统中任务的优先级安排如下程序清单所示,voidTask_FastSamp(void*pdata);//使用高优先级中断的采样,优先级5voidTask_HookSamp(void*pdata);//使用钩子函数的采样任务,优先级6voidTask_TimerSamp(void*pdata);//使用定时中断的采用任务,优先级7voidTask_DelaySamp(void*pdata);//使用延时函数的采用任务,优先级8voidTask_Send(void*pdata);//串口发送任务,优先级13·12·voidTask_Key(void*pdata);//键盘任务,优先级15voidTask_Disply(void*pdata);//显示任务,优先级17程序运行过程中,当系统检测到键盘输入后,根据采样周期的设定值而创建一个采样任务和串口发送任务Task_Send()。4个采样任务Task_FastSamp(),Task_HookSamp(),Task_TimerSamp(),Task_DelaySamp()和串口发送任务Task_Send()均为一次性任务,且在任务完成后自动删除。Task_Disply()为消息队列驱动的任务,根据消息队列传送的内容进行不同的显示操作。Task_Key()是周期性执行的任务,不断检测键盘输入,并根据检测结果,做出不同的响应。键盘任务是系统运行的第一个任务,负责系统初始化和其它任务的创建。该任务运行后,接收用户输入并根据接收到的输入值启动不同的采样任务。同时,将接收到的输入值通过消息队列的形式发送到显示任务。显示任务负责显示用户输入的参数值和采样任务采样得到的数据。串口发送任务在键盘任务检测到发送操作按键确定时创建。该任务负责从全局采样数组中读取数据并使用中断方式发送到上位机。全局采样数组是系统初始化时建立的FIFO缓存,通过互斥信号量保护。4个采样任务均在键盘接收到用户输入后创建,不同的采样任务使用不同的采样方式进行采样,并将采样所得数据保存在全局FIFO缓存中。所有采样任务在采样过程中的工作就是检测什么时候采样结束,并且负责将采样所得的数据进行处理。处理完毕后,发送消息通知显示任务,最后删除自己本身。8.3任务实现详解开始程序设计之前,首先了解一下主函数。在主函数中,进行了操作系统的初始化,创建了一个键盘任务,然后,启动多任务操作系统。主程序代码如下:intmain(void){OSTaskCreateExt(Task_Key,//任务指针·13·Tmr_TickInit();//操作系统Tick初始化OSInit();/*初始化OS*/Bsp_Init();//系统外设初始化PWM_IoConfiguration();//初始化系统时钟#if(OS_TASK_NAME_SIZE>=16)INT8Uerr;#endif(void*)0,(OS_STK*)&InitTaskStk[OS_INIT_TASK_STACK_SIZE-1],}OSStart();return(0);/*启动多任务环境*/OS_TASK_KEY_PRIO,//任务优先级OS_TASK_KEY_PRIO,(OS_STK*)&InitTaskStk[0],OS_INIT_TASK_STACK_SIZE,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);#if(OS_TASK_NAME_SIZE>=16)OSTaskNameSet(OS_TASK_IDLE_PRIO,(INT8U*)"Idletask",&err);OSTaskNameSet(OS_TASK_INIT_PRIO,(INT8U*)"Inittask",&err);#endif从程序中可以看到,当执行OSStart()后,主函数返回,但了解了ucos-II操作系统后,可以知道这个“return0”的语句是不可能执行的。在主函数中创建了一个键盘任务Task_Key(),其优先级为15,负责初始化目标板和根据用户输入创建其他任务。8.3.1键盘任务键盘任务的主要工作就是周期性扫描键盘,优先级为15。其程序流程图如图8.1所示。·14·图8.1键盘任务程序流程图程序中,首先进行目标板初始化,目标板初始化过程请参见《STM32F103处理器内部资源C编程与实例》一章讲解。之所以将目标的初始化放在第一个任务里,是为了保证该初始化在OSStart()执行后完成。值得注意的是,与采样任务相关的A/D转换初始化也放在了这里,这是因为4个采样任务都用到了A/D转换,放在键盘任务中一次完成,避免了在每个采样任务中单独初始化而带来的代码冗余。接下来创建显示任务Task_Disp(),屏幕初始化工作放在该任务中完成。最后创建了任务轮转不可或缺的一些操作系统资源,包括一个互斥信号量Sem,一个邮箱MyMbox和一个消息队列ReMsgQeue,其中消息队列中消息数目定义为10。按键处理是这个键盘任务的关键,这个键盘任务中状态转移情况如表8.1所示。表8.1键盘状态转移表·15·篇三:ucos-II消息邮箱示例程序uc/os-II消息邮箱示例程序2007-12-0512:27消息邮箱是进程通讯中的重要工具,在本例中,使用一个POST任务来发送消息(一个字符,从A-Z),用一个PEND来接收消息。注意,在本例中发送任务是每个时钟周期都发送,而接收任务每3个时钟周期才接收一次。所以,一定会有某些字符不能接收到。由于消息邮箱(长度为1的消息队列)是消息队列的特殊情况,所以在以后的消息队列程序中还将实验这种情况,看是否会有字符丢失。/***********************************************************************************************************uC/OS-II*TheReal-TimeKernel**(c)Copyright2004,YuanFei,HefeiUniversityofTechnology*AllRightsReserved****Filename:test.c*Programmer(s):yuanfei*DESCRIPTION:ThisfileillustratetheusageofMessageMailbox.***********************************************************************************************************/#include"includes.h"/***********************************************************************************************************TYPE**********************************************************************************************************/typedefcharMESSAGE;/*消息为单个字符*//***********************************************************************************************************CONSTANTS**********************************************************************************************************/#defineTASK_STK_SIZE256/*Sizeofeachtask'sstacks(#ofWORDs)*/#defineN_TASKS2/*Numberofidenticaltasks*//***********************************************************************************************************VARIABLES**********************************************************************************************************/OS_STKTaskStk[N_TASKS][TASK_STK_SIZE];/*Tasksstacks*/OS_STKTaskStartStk[TASK_STK_SIZE];OS_EVENT*Mailbox;/***********************************************************************************************************FUNCTIONPROTOTYPES**********************************************************************************************************/voidTaskStart(void*data);/*FunctionprototypesofStartuptask*/staticvoidMboxPend(void*data);/*等待字符的进程*/staticvoidMboxPost(void*data);/*发送字符的进程*//***********************************************************************************************************MAIN**********************************************************************************************************/voidmain(void){PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);/*Clearthescreen*/OSInit();/*InitializeuC/OS-II*/PC_DOSSaveReturn();/*SaveenvironmenttoreturntoDOS*/PC_VectSet(uCOS,OSCtxSw);/*InstalluC/OS-II'scontextswitchvector*/OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);OSStart();/*Startmultitasking*/}/***********************************************************************************************************STARTUPTASK**********************************************************************************************************/voidTaskStart(void*pdata){#ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/OS_CPU_SRcpu_sr;#endifINT16Skey;pdata=pdata;/*Preventcompilerwarning*/OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);/*InstalluC/OS-II'sclocktickISR*/PC_SetTickRate(OS_TICKS_PER_SEC);/*Reprogramtickrate*/OS_EXIT_CRITICAL();Mailbox=OSMboxCreate((void*)0);OSTaskCreate(MboxPost,0,&TaskStk[0][TASK_STK_SIZE-1],2);OSTaskCreate(MboxPend,0,&TaskStk[1][TASK_STK_SIZE-1],3);for(;;){if(PC_GetKey(&key)==TRUE){/*Seeifkeyhasbeenpressed*/if(key==0x1B){/*Yes,seeifit'stheESCAPEkey*/PC_DOSReturn();/*ReturntoDOS*/}}OSTimeDlyHMSM(0,0,1,0);/*Waitonesecond*/}}staticvoidMboxPost(void*pdata){MESSAGEmsg;for(msg='A';msg<='Z';msg++){OSMboxPost(Mailbox,&msg);OSTimeDly(1);if(msg=='Z'){msg='A';}}}staticvoidMboxPend(void*pdata){MESSAGEmsg;INT16Ui;INT8Uerr;for(i=0;;++i){msg=*(MESSAGE*)OSMboxPend(Mailbox,0,&err);PC_DispChar(i%80,i/80,msg,DISP_FGND_WHITE);OSTimeDly(3);if(i>2000){i=0;}}}篇四:ucos-ii的移植例子两个任务分别控制一个led,位于PB4和PB5.PB4上的led每秒闪一次,PB5上的led每四秒闪一次。#include"lf2407.h"#include"ucos_ii.h"OS_STKMain_TaskStk[64];OS_STKSub_TaskStk[64];voidMain_Task(void*data);voidSub_Task(void*data);voidInitCPU(void){SCSR1=0x00fd;SCSR2=(SCSR2|0x000b)&0x000f;WDCR=0x00e8;WSGR=0x0040;MCRA=0x0FFF;PBDATDIR=PBDATDIR|0x0F000;T2CON=0x0000;GPTCONA=0x0000;T2CNT=0x0000;T2PR=50000;T2CON=0xd340;IMR=0x0000;IFR=0x003f;IMR=0x0004;EVAIFRA=0xFFFF;EVAIFRB=0xFFFF;EVAIFRC=0xFFFF;EVAIMRA=0x0000;EVAIMRB=0x0000;EVAIMRC=0x0000;EVBIFRA=0xFFFF;EVBIFRB=0xFFFF;EVBIFRC=0xFFFF;EVBIMRA=0x0000;EVBIMRB=0x0000;EVBIMRC=0x0000;asm("CLRCINTM");}intmain(void){InitCPU();OSInit();OSTaskCreate(Main_Task,OSStart();return0;}voidMain_Task(void*p_arg)void*)0,&Main_TaskStk[63],);(0{EnableTick();OSTaskCreate(Sub_Task,(void*)0,&Sub_TaskStk[63],10);while(1){PBDATDIR|=0x0010;OSTimeDlyHMSM(0,0,0,500);PBDATDIR&=0x0ffef;OSTimeDlyHMSM(0,0,0,500);}}voidSub_Task(void*p_arg){while(1){PBDATDIR|=0x0020;OSTimeDlyHMSM(0,0,2,0);PBDATDIR&=0x0ffdf;OSTimeDlyHMSM(0,0,2,0);}}ucos-ii的移植及rtos下的应用APIFOR44B0要保证μC/OS-Ⅱ移植到微处理器后能正确运行;处理器需具备如下特性:1)处理器的c编译器支持可重入函数可重入的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据。也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。下面的两个例子可以比较可重入型函数和非可重入型函数:程序1:可重入型函数voidswap(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;程序2:非可重入型函数inttemp;voidswap(int*x,int*y)temp=*x;*x=*y;*y=temp;程序1中使用的是局部变量temp作为变量。通常的C编译器,把局部变量分配在栈中。所以,多次调用同一个函数,可以保证每次的temp互不受影响。而程序2中temp定义的是全局变量,多次调用函数的时候,必然受到影响。代码的可重入性是保证完成多任务的基础,除了在C程序中使用局部变量以外,还需要C编译器的支持。笔者使用的是ARMSDT以及ADS的集成开发环境,均可以生成可重入的代码。2)在程序中可以打开和关闭中断在μC/OS-Ⅱ中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持,在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。3)处理器支持中断,并且能产生定时器中断(uc/os-ii是通过定时器中断来实现多任务的调度,即时间片的产生)μC/OS-Ⅱ是通过处理器产生的定时器的中断来实现多任务之间的调度的。在ARM7TDMI的处理器上可以产生定时器中断。4)处理器要具有一定的硬件堆栈数量5)处理器要有将堆栈指针和其他cpu寄存器存储和读出堆栈(或者内存)的指令(如51的pop,push指令)。μC/OS-Ⅱ进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是μC/OS-Ⅱ多任务调度的基础。ARM7TDMI处理器完全满足上述要求。接下来将介绍如何把μC/OS-Ⅱ移植到Samsung公司的一款ARM7TDMI的嵌入式处理器——S3C44B0X上。μC/OS-Ⅱ中与处理器有关的代码:os_cpu.hos_cpu_a.asmos_cpu_c.cμC/OS-Ⅱ的设置:os_cfg.hinludes.hμC/OS-Ⅱ在44b0上的移植1)设置inludes.h中与处理器及编译器有关的代码FORADS/***********************************************************************************************************uC/OS-II*TheReal-TimeKernel**(c)Copyright1992-1998,JeanJ.Labrosse,Plantation,FL*AllRightsReserved**MASTERINCLUDEFILE**********************************************************************************************************/#include"os_cpu.h"#include"os_cfg.h"#include"ucos_ii.h"这里未做处理取默认的数据类型。FORSDT/***********************************************************************************************************uC/OS-II*TheReal-TimeKernel**(c)Copyright1992-1998,JeanJ.Labrosse,Plantation,FL*AllRightsReserved**MASTERINCLUDEFILE**********************************************************************************************************/
本文档为【ucos程序范例 (20页)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥16.9 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
万用文库
暂无简介~
格式:doc
大小:25KB
软件:Word
页数:0
分类:
上传时间:2020-06-29
浏览量:30