tag 标签: ucos-ii

相关博文
  • 热度 27
    2014-6-30 01:08
    1519 次阅读|
    0 个评论
      注意:以下大部分知识源自邵贝贝老师以及任哲老师的书,本人只是加上个人理解后作为学习笔记使用,商业用途请联系原作者。 1 、前后台系统 前台:中断服务程序处理异常事件;所以前台可以叫做中断级;(可以理解为处理特殊军情的军机处) 后台:无线循环的应用程序,循环中调用相应的函数完成相应的操作;所以后台也可称为任务级;(处理日常事务的内阁)   2 、代码的临界段 也叫临界区,指处理时不可分割的代码。在该代码执行的时候,它是不允许任何中断插入打断的; 所以为了确保临界段不被打扰,执行前通常关中断,执行完之后通常开中断;   3 、资源与共享资源 资源 就是被任务所占用的实体,比如变量数组结构体,又或是打印机、键盘显示器等设备; 共享资源 就是可以被两个或以上的任务所使用的实体。然而,虽说是共享,就像是公**立卫生间 一样,任务在使用它时是必须独占它的,为了防止数据被破坏。这个就叫 互斥! (以后将会多次提到,共享资源的前提是必须满足信号量互斥!这点谨记哦)   4 、任务切换 当多任务内核决定运行另外的程序时,就会把当前正在运行的任务的当前状态(寄存器中的全部内容),保存在自己任务的栈区中;然后再将下一个要运行的任务的当前状况从该任务的栈中装入 CPU 的寄存器,开始运行。这个过程叫做任务切换。   5 、内核 Kernel 内核在多任务系统中负责管理各个任务,或者说为每个任务分配 CPU 时间,并且负责任务间的通信。 内核本身的代码会增加 ROM 的用量,本身的数据结构会增加 RAM 的用量。然而, 这并不是内存的最大占用。每一个任务都要有自己的堆栈空间,这部分占用内存相当多。所以,一般单片机不能运行实时内核,因为其 RAM 有限。除非扩展。   基于优先级调度的内核有两种:可剥夺型和不可剥夺型。 ( 1 )不可剥夺型内核: 最鲜明的特点是用户不可强制剥夺某一个任务对 CPU 的使用权,而只能要求每个任务主动放弃 CPU 的使用权。异步事件还是由中断服务程序来处理,但是 CPU 是通过各个任务彼此合作共享的,好比是政治中的内阁一样,通过各个大臣共同协商来决定一件事,然后突发事件比如说倭寇入侵,那么就直接交给军机处(中断服务程序)了。中断服务后,使用权还是回到被中断前的那个任务 , 继续执行 , 直到任务执行完毕释放 CPU 为止。      不可剥夺性内核有两个优点 :   ① 第 一个就是他有一个很不错的救火消防员 -- 响应中断速度快;   ② 第二个就是无须请额外的保镖(信号量)来保护家中那些共享资源,因为运行着的任务就是独立地占有着 CPU ,别的任务是不敢过来抢夺的,为啥,因为我就是不可剥夺型内核啊,敢造反不成!!! O( ∩ _ ∩ )O     诚然,不可剥夺型内核的缺点还是有的,而且有得很明显——任务响应时间慢。那就是你再有特权,背景比我深,本事比我强,优先级比我高,那也不行,就绪后还得在我使用完 CPU 后才能给你,你还不能抢。所以,有时候,会把你搞得很委屈,因为也许你要等我很久。。很久。。。     ( 2 )可剥夺型内核   必须指出一点就是:当你的系统响应时间很重要时,那就不要使用不可剥夺性内核了, instead ,你要使用可剥夺型内核,事实上,很多商业实时内核,包括 uc /os 都是可剥夺型内核哦!!这下子就是讲究谁的权力更大的时候了、 可剥夺型内核的世界里,规矩很简单——谁的优先级最高,一旦就绪,我总会给你 CPU 的使用权的,而不必等。比如说 A 在使用 CPU, 然后异常中断 B 来了,于是 A 暂停,去处理 B ,在处理 B 时,比 A 更高优先级的任务 C 来了,嗯,处理完 B ,注意,请注意,这不是演习(哈哈,爱情公寓、、)这里我的理解是哪怕是 C 的优先级比 B 还高,应该也是要等中断 B 执行完毕后再去执行 C 的,而 A ?不好意思,继续等着。谁叫你优先级低。。。 可剥夺型内核的优点是任务级系统的响应时间得到了最优化,而且是可知的(因为优先级就是用户自己给任务设定的。所以时间也可以自己推算)   6 、可重入函数 可重入,顾名思义,当然是可以随时被中断打断,可以被一个以上的任务所调用,而不必担心函数中的数据被破坏掉。它会自动地将变量和数据保存在 CPU 寄存器或者堆栈中。 比如说我们对字符串的操作中有个函数就是字符串复制: str cpy 就是个可重入函数。 谁是可重入函数,谁是不可重入函数,不是我们自己定义的, UC/OS 开发人已经定义好,我们会区分使用即可。   7 、时间片轮番调度法 当 2 个或者 2 个以上的任务具有相同的优先级的时候,内核允许一个任务运行事先确定的一段时间(称为时间额度),然后切换给另外一个任务。这个过程就叫做“时间片轮番调度法”。 注意的是: ( 1 ) UC/OS-II 不支持时间片轮番调度法,所以用户在最多的 256 个优先级里必须给任务设定不同的优先级; ( 2 )最新发布的 UC/OS-III 不仅任务和优先级无数目限制,而且支持了时间片轮番调度。  
  • 热度 28
    2014-6-30 01:07
    2183 次阅读|
    0 个评论
      在前面的移植中,大多都是模糊理解,所以我觉得有必要对主函数 main.c 中的内容进行简单分析一下,以便加深UCOS-II的理解。 1 、包含所有的头文件: #include "includes.h"         #include "includes.h" 常用内容是: #ifndef __INCLUDES_H #define __INCLUDES_H   #include "stm32f10x.h" #include "stm32f10x_rcc.h"   #include "uCOS_II.h" #include "BSP.h"                //与开发板相关的函数 #include "app.h" #include "led.h"   #endif   2 、定义一个堆栈: static OS_STK startup_task_stk ;       其中堆栈大小 STARTUP_TASK_STK_SIZE 在 a pp_cfg.h 中已经定义了 ;   3 、 BSP_Init() :用户驱动程序初始化,主要包括: ( 1 ) SystemInit(); // 系统时钟配置成 72MHz ( 2 ) LED_GPIO_Config(); //LED 端口配置 4 、 OSInit():        主要包括 5 个函数,用来初始化 uC/OS -II 的内部构件,具体包括所有的变量和数据结构; ( 1 )建立空闲任务: OS_InitTaskIdle(); 优先级最低,即 OS_LOWEST_PRIO ( 2 )如果统计任务允许 OS_TASK_STAT_EN 设置为 1 ,则、 OSInit() 建立统计任务: OS_InitTaskStat(); 其优先级是                                             OS_LOWEST_PRIO-1 ;   5 、 OSTaskCreate(Task_LED,(void*)0,startup_task_stk ,STARTUP_TASK_PRIO); 创建任务 Task _LED, 这个 OSTaskCreate 函数的原型是: INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio) 需要四个参数: ① task 是指向任务代码的指针; 这里 就是任务函数名 ② p_arg 是任务开始执行时,传递给任务的参数的指针 , 即任务初始化指针; 这里 不需要初始化,所以为 NULL 空指针; ③ ptos 是分配给任务的堆栈的栈顶指针; 这里 一开始定义了一个堆栈,给当前数据赋予堆栈数据的末尾单元,从末尾开始往开始 ④ p rio 是分配给任务的优先级; 这里 优先级为 0 ,为最高优先级; 这里 Task_LED 是指向任务的指针,原型函数在 app. c 里编写,任务看起来与 C 函数一样,具有返回类型和一个参数,但是它绝对不返回,因此,返回类型必须定义成 void 型。   任务 Task_LED 的原型是 void Task_LED(void *p_arg) ,带有一个指针参数     注意:   如果任务中没有用到指针 p_arg , 那么防止编译器警告,应该在第一行写上( void)p_arg;   6 、 OSStart(); 调用 OSStart(); 将控制权交给 uC/OS -II 内核,开始运行多任务;OSStart();将判断所有建立任务中哪一个任务是最重要的(优先级最高),并开始运行这个任务; 注意:    在启动多任务 OSStart(); 之前至少要先建立一个任务,否则应用程序就会崩溃。
  • 热度 29
    2014-6-30 01:05
    1402 次阅读|
    5 个评论
      今天在 PC 机上第一次运行了 UC/OS-II 程序,不是在 STM32 平台上,成功生成应用程序,显示出了“ snail ”这个字符串。期间搞明白了很多函数,包括从未用过的 PC 自带的功能函数。 哈哈,原来 WINDOWS 下面还有不少可以直接调用的函数。真心不错。搞完单任务,接下来弄双任务。      /******************************************************************************************** **file name  : test1.c **description: 每秒在显示器上打印字母 SNAIL **author     : snail **vision     : 1.0 *********************************************************************************************/   #include "includes.h" #define TASK_STK_SIZE 512   /*定义堆栈长度*/ OS_STK MytaskSTK ;  /*定义任务堆栈区*/ INT16S key ;            /*用于退出ucos*/ INT8U x=0,y=0;              /*字符显示的位置*/ void TaskOne(void *data); void main(void) {     char* s_m="snail"; //初始化uc/os OSInit(); //保存DOS环境 PC_DOSSaveReturn(); //安装uc/os 任务切换中断向量 PC_VectSet(uCOS,OSCtxSw); OSTaskCreate(          TaskOne,                          //创建的任务MyTask s_m,                          //给任务传递参数 MytaskSTK , //设置任务堆栈栈顶指针 0                //MyTask 优先级别为0 ); //启动多任务管理 OSStart();   }   /****************************************************************************************** **function name: MyTask **description  : 打印字母SNAIL **input        : *data **output       : none **return       : none *****************************************************************************************/ void TaskOne(void *pdata) {       INT8U i=0; #if OS_CRITICAL_METHOD==3     OS_CPU_SR cpu_sr; #endif     pdata=pdata; //没有实际意义,仅是为了避免有些编译器会警告pdata这参数没有使用 OS_ENTER_CRITICAL();//一个宏,用来禁止处理器响应中断请求,即关中断 //给ucos安装时钟中断 PC_VectSet(0x08,OSTickISR); //设置时钟频率,OS_TICKS_PER_SEC=200 PC_SetTickRate(OS_TICKS_PER_SEC); //一个宏,允许处理器响应中断请求,即开中断     OS_EXIT_CRITICAL(); //测试所使用处理器的速度 OSStatInit(); for(;;) { for(i=0;i5;i++)        //无限循环 {     if(x10) {     x=0; y+=2; } //调用PC中的函数来显示字符 PC_DispChar(   x,y,   *((char * )pdata+i),   DISP_FGND_RED+DISP_FGND_WHITE ); x+=1;    OSTimeDlyHMSM(0,0,1,0); } y+=2; //如果按下了ESC键,那么退出UC/OS-II if(PC_GetKey(key)==TRUE) {     if(key==0x1b) {     //返回dos PC_DOSReturn(); } } } }  
  • 热度 22
    2012-2-20 17:04
    2227 次阅读|
    0 个评论
    本人的博客地址  http://blog.sina.com.cn/s/blog_98ee3a930100waci.html
  • 热度 13
    2012-2-20 17:02
    2103 次阅读|
    0 个评论
    详细的看我的新浪博客 附几张图片 http://blog.sina.com.cn/s/blog_98ee3a930100wabw.html    
相关资源