精华内容
下载资源
问答
  • UCOSII学习笔记-1.ucosii移植基本信息STEP1 准备一个没有错误LED例程STEP2 下载UCOSII源码UCOSII移植1.添加文件到自己的工程文件中2.文件加载到工程3.修改文件软件设计编译下载 基本信息 硬件平台:stm32f103 软件...

    基本信息

    	硬件平台:stm32f103
    	软件环境:MDK5
    	
    	移植ucosii花了我很多时间,首先看了正点哥的视频,看不太懂。接下来又看野火哥,野火哥用了一堆从
    	自己例程中复制过来的代码,看的有点蒙。接下来我就去看了cortex-m3中文权威指南,大概了解了m3的
    	通用寄存器、特殊寄存器、中断原理、滴答定时器的内容(cosii的函数都是基于这部分内容编写的,比如
    	临界区的概念建议要了解下),然后我就开始看cosii系统要编写的几个函数,最后还是回到原子哥的视频
    	着手移植。
    

    STEP1 准备一个没有错误LED例程

    为保证移植后编译错误只与ucosii有关,一定要保证移植前的程序无误。
    在这里插入图片描述
    在这里插入图片描述
    以上用的例程来自原子哥的库函数版本跑马灯实验

    1.在目录中创建文件夹UCOSII、UCOSII/CORE、UCOSII/PORT、UCOSII/CONFIG。

    	CORE用来存UCOSII源码
    	PORT存接口文件,移植于不同芯片,裁剪ucosii系统需要进行修改
    	CONFIG存配置文件
    

    STEP2 下载UCOSII源码

    官方链接:(stm32fi03)

    https://www.micrium.com/download/micrium_stm32f103-sk_ucos-ii/
    

    下载得到文件目录如下
    在这里插入图片描述
    主要用到software\ucosII中的文件
    在这里插入图片描述

    UCOSII移植

    1.添加文件到自己的工程文件中

    • PORT

    \Ports\arm-cortex-m3\Generic\IAR
    在这里插入图片描述
    复制的我的工程目录UCOSII/PORT

    • CORE

    \Source下文件复制到UCOSII/CORE
    在这里插入图片描述

    • CONFIG
      复制Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD的os_cfg.h到UCOSII/CONFIG

    2.文件加载到工程

    添加文件与添加头文件路径最终结果:
    在这里插入图片描述
    在这里插入图片描述

    3.修改文件

    1.修改includes.h,这是ucos源码中通用的头文件,由于我复制的是其他工程项目的头文件,有些文件我并没有,所以改为以下代码:

    >#ifndef __INCLUDES_H__
    	#define __INCLUDES_H__	
    //以上防重定义
    //ucosii所用到的头文件
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #include "usart.h"
    #include "ucos_ii.h"
    #include "os_cpu.h"
    #include "os_cfg.h"
    #include <stm32f10x.h>	    
    #include "sys.h"
    //main例程要用的头文件
    #include "delay.h"
    #include "led.h"
    #endif
    

    2.修改os_cfg.h,这是用来配置和裁剪内核的,也是跟上面一样,摘抄原子哥的例程,这里很多都不懂的,先跑通一次,成功看到效果再来就这正确的模板深入学习

    #ifndef OS_CFG_H
    #define OS_CFG_H
                                           /* ---------------------- MISCELLANEOUS ----------------------- */
    #define OS_APP_HOOKS_EN           0u   /* Application-defined hooks are called from the uC/OS-II hooks */
    #define OS_ARG_CHK_EN             0u   /* Enable (1) or Disable (0) argument checking                  */
    #define OS_CPU_HOOKS_EN           1u   /* uC/OS-II hooks are found in the processor port files         */
    #define OS_DEBUG_EN               0u   /* Enable(1) debug variables                                    */
    #define OS_EVENT_MULTI_EN         0u   /* Include code for OSEventPendMulti()                          */
    #define OS_EVENT_NAME_EN          0u   /* Enable names for Sem, Mutex, Mbox and Q                      */
    #define OS_LOWEST_PRIO           63u   /* Defines the lowest priority that can be assigned ...         */
                                           /* ... MUST NEVER be higher than 254!                           */
    #define OS_MAX_EVENTS            10u   /* Max. number of event control blocks in your application      */
    #define OS_MAX_FLAGS              5u   /* Max. number of Event Flag Groups    in your application      */
    #define OS_MAX_MEM_PART           0u   /* Max. number of memory partitions                             */
    #define OS_MAX_QS                 5u   /* Max. number of queue control blocks in your application      */
    #define OS_MAX_TASKS             10u   /* Max. number of tasks in your application, MUST be >= 2       */
    #define OS_SCHED_LOCK_EN          1u   /* Include code for OSSchedLock() and OSSchedUnlock()           */
    #define OS_TICK_STEP_EN           1u   /* Enable tick stepping feature for uC/OS-View                  */
    #define OS_TICKS_PER_SEC       	200u   /* Set the number of ticks in one second                        */
                                           /* --------------------- TASK STACK SIZE ---------------------- */
    #define OS_TASK_TMR_STK_SIZE    128u   /* Timer      task stack size (# of OS_STK wide entries)        */
    #define OS_TASK_STAT_STK_SIZE   128u   /* Statistics task stack size (# of OS_STK wide entries)        */
    #define OS_TASK_IDLE_STK_SIZE   128u   /* Idle       task stack size (# of OS_STK wide entries)        */
                                           /* --------------------- TASK MANAGEMENT ---------------------- */
    #define OS_TASK_CHANGE_PRIO_EN    1u   /*     Include code for OSTaskChangePrio()                      */
    #define OS_TASK_CREATE_EN         1u   /*     Include code for OSTaskCreate()                          */
    #define OS_TASK_CREATE_EXT_EN     1u   /*     Include code for OSTaskCreateExt()                       */
    #define OS_TASK_DEL_EN            1u   /*     Include code for OSTaskDel()                             */
    #define OS_TASK_NAME_EN           1u   /*     Enable task names                                        */
    #define OS_TASK_PROFILE_EN        1u   /*     Include variables in OS_TCB for profiling                */
    #define OS_TASK_QUERY_EN          1u   /*     Include code for OSTaskQuery()                           */
    #define OS_TASK_REG_TBL_SIZE      1u   /*     Size of task variables array (#of INT32U entries)        */
    #define OS_TASK_STAT_EN           1u   /*     Enable (1) or Disable(0) the statistics task             */
    #define OS_TASK_STAT_STK_CHK_EN   1u   /*     Check task stacks from statistic task                    */
    #define OS_TASK_SUSPEND_EN        1u   /*     Include code for OSTaskSuspend() and OSTaskResume()      */
    #define OS_TASK_SW_HOOK_EN        1u   /*     Include code for OSTaskSwHook()                          */
                                           /* ----------------------- EVENT FLAGS ------------------------ */
    #define OS_FLAG_EN                1u   /* Enable (1) or Disable (0) code generation for EVENT FLAGS    */
    #define OS_FLAG_ACCEPT_EN         1u   /*     Include code for OSFlagAccept()                          */
    #define OS_FLAG_DEL_EN            1u   /*     Include code for OSFlagDel()                             */
    #define OS_FLAG_NAME_EN           1u   /*     Enable names for event flag group                        */
    #define OS_FLAG_QUERY_EN          1u   /*     Include code for OSFlagQuery()                           */
    #define OS_FLAG_WAIT_CLR_EN       1u   /* Include code for Wait on Clear EVENT FLAGS                   */
    #define OS_FLAGS_NBITS           16u   /* Size in #bits of OS_FLAGS data type (8, 16 or 32)            */
                                          /* -------------------- MESSAGE MAILBOXES --------------------- */
    #define OS_MBOX_EN                1u   /* Enable (1) or Disable (0) code generation for MAILBOXES      */
    #define OS_MBOX_ACCEPT_EN         1u   /*     Include code for OSMboxAccept()                          */
    #define OS_MBOX_DEL_EN            1u   /*     Include code for OSMboxDel()                             */
    #define OS_MBOX_PEND_ABORT_EN     1u   /*     Include code for OSMboxPendAbort()                       */
    #define OS_MBOX_POST_EN           1u   /*     Include code for OSMboxPost()                            */
    #define OS_MBOX_POST_OPT_EN       1u   /*     Include code for OSMboxPostOpt()                         */
    #define OS_MBOX_QUERY_EN          1u   /*     Include code for OSMboxQuery()                           */
                                           /* --------------------- MEMORY MANAGEMENT -------------------- */
    #define OS_MEM_EN                 1u   /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */
    #define OS_MEM_NAME_EN            1u   /*     Enable memory partition names                            */
    #define OS_MEM_QUERY_EN           1u   /*     Include code for OSMemQuery()                            */
                                           /* ---------------- MUTUAL EXCLUSION SEMAPHORES --------------- */
    #define OS_MUTEX_EN               1u   /* Enable (1) or Disable (0) code generation for MUTEX          */
    #define OS_MUTEX_ACCEPT_EN        1u   /*     Include code for OSMutexAccept()                         */
    #define OS_MUTEX_DEL_EN           1u   /*     Include code for OSMutexDel()                            */
    #define OS_MUTEX_QUERY_EN         1u   /*     Include code for OSMutexQuery()                          */
                                           /* ---------------------- MESSAGE QUEUES ---------------------- */
    #define OS_Q_EN                   1u   /* Enable (1) or Disable (0) code generation for QUEUES         */
    #define OS_Q_ACCEPT_EN            1u   /*     Include code for OSQAccept()                             */
    #define OS_Q_DEL_EN               1u   /*     Include code for OSQDel()                                */
    #define OS_Q_FLUSH_EN             1u   /*     Include code for OSQFlush()                              */
    #define OS_Q_PEND_ABORT_EN        1u   /*     Include code for OSQPendAbort()                          */
    #define OS_Q_POST_EN              1u   /*     Include code for OSQPost()                               */
    #define OS_Q_POST_FRONT_EN        1u   /*     Include code for OSQPostFront()                          */
    #define OS_Q_POST_OPT_EN          1u   /*     Include code for OSQPostOpt()                            */
    #define OS_Q_QUERY_EN             1u   /*     Include code for OSQQuery()                              */
                                           /* ------------------------ SEMAPHORES ------------------------ */
    #define OS_SEM_EN                 1u   /* Enable (1) or Disable (0) code generation for SEMAPHORES     */
    #define OS_SEM_ACCEPT_EN          1u   /*    Include code for OSSemAccept()                            */
    #define OS_SEM_DEL_EN             1u   /*    Include code for OSSemDel()                               */
    #define OS_SEM_PEND_ABORT_EN      1u   /*    Include code for OSSemPendAbort()                         */
    #define OS_SEM_QUERY_EN           1u   /*    Include code for OSSemQuery()                             */
    #define OS_SEM_SET_EN             1u   /*    Include code for OSSemSet()                               */
                                           /* --------------------- TIME MANAGEMENT ---------------------- */
    #define OS_TIME_DLY_HMSM_EN       1u   /*     Include code for OSTimeDlyHMSM()                         */
    #define OS_TIME_DLY_RESUME_EN     1u   /*     Include code for OSTimeDlyResume()                       */
    #define OS_TIME_GET_SET_EN        1u   /*     Include code for OSTimeGet() and OSTimeSet()             */
    #define OS_TIME_TICK_HOOK_EN      1u   /*     Include code for OSTimeTickHook()                        */
                                           /* --------------------- TIMER MANAGEMENT --------------------- */
    #define OS_TMR_EN                 0u   /* Enable (1) or Disable (0) code generation for TIMERS         */
    #define OS_TMR_CFG_MAX           16u   /*     Maximum number of timers                                 */
    #define OS_TMR_CFG_NAME_EN        1u   /*     Determine timer names                                    */
    #define OS_TMR_CFG_WHEEL_SIZE     8u   /*     Size of timer wheel (#Spokes)                            */
    #define OS_TMR_CFG_TICKS_PER_SEC 10u   /*     Rate at which timer management task runs (Hz)            */
    #endif
    

    3.打开sys.h,打开ucosii:
    在这里插入图片描述
    4.注释掉stm32f10x_it.c中与os_cpu.asm重了的两个函数
    在这里插入图片描述

    5.编译,应该能通过了,

    至此,ucosii的移植就完成了,接下来就是软件设计部分

    软件设计

    #include <includes.h>
    //****START任务*****
    //设置任务优先级
    #define START_TASK_PRIO 			10		//开始任务优先级为最低
    //设置任务堆栈大小
    #define START_STK_SIZE 				128
    //任务堆栈
    OS_STK START_TASK_STK[START_STK_SIZE];
    //任务函数
    void start_task(void *pdata);
    
    //******LED0任务*****
    
    #define LED0_TASK_PRIO				7
    #define LED0_STK_SIZE 				64
    OS_STK 	LED0_TASK_STK[LED0_STK_SIZE];
    void led0_task(void *pdata);
    
    //****LED1任务*****
    
    #define LED1_TASK_PRIO				6
    #define LED1_STK_SIZE 				128
    OS_STK 	LED1_TASK_STK[LED1_STK_SIZE];
    void led1_task(void *pdata);
    
    //*****浮点测试任务****
    
    #define FLOAT_TASK_PRIO				5
    #define FLOAT_STK_SIZE 				128
    __align(8)OS_STK 	FLOAT_TASK_STK[FLOAT_STK_SIZE];
    void float_task(void *pdata);
    
    int main(void ){
    	delay_init();
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	uart_init(115200);
    	LED_Init();
    	
    	OSInit();
    	OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],\
    		START_TASK_PRIO);
    	OSStart();
    	return 0;
    }
    
    void start_task(void*pdata){
    	OS_CPU_SR cpu_sr = 0;
    	pdata=pdata;
    	OSStatInit();	//开启统计任务
    	
    	OS_ENTER_CRITICAL();//进入临界区
    	//创建任务
    	OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],\
    		LED0_TASK_PRIO);
    	OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED0_STK_SIZE-1],\
    		LED1_TASK_PRIO);
    	OSTaskCreate(float_task,(void*)0,(OS_STK*)&FLOAT_TASK_STK[LED0_STK_SIZE-1],\
    		FLOAT_TASK_PRIO);
    	
    	OSTaskSuspend(START_TASK_PRIO);//挂起开始任务
    	OS_EXIT_CRITICAL();	//退出临界区
    }
    
    void led0_task(void *pdata){
    	while(1){
    		LED0 = 0;
    		delay_ms(80);
    		LED0 = 1;
    		delay_ms(400);
    	}
    }
    
    void led1_task(void *pdata){
    	while(1){
    		LED1 = 0;
    		delay_ms(300);
    		LED1 = 1;
    		delay_ms(300);
    	}
    }
    
    void float_task(void *pdata){
    	OS_CPU_SR cpu_sr = 0;
    	static float float_num = 0.01;
    	while(1){
    		float_num += 0.01f;
    		OS_ENTER_CRITICAL();
    		printf("float_num 的值为:%4f\r\n",float_num);
    		OS_EXIT_CRITICAL();
    		delay_ms(500);
    	}
    
    
    }
    

    编译下载

    LED任务直接可视
    浮点测试则在串口调试助手中可以看

    展开全文
  • 从零开始学习UCOSII操作系统1--UCOSII的基础知识

    万次阅读 多人点赞 2018-03-24 19:13:20
    从零开始学习UCOSII操作系统1--UCOSII的基础知识前言:首先比较主流的操作系统有UCOSII、FREERTOS、LINUX等,UCOSII的资料相对比其余的两个操作系统的资料是多很多的。更重要的原因是自己本身还没有能力深入的研究...

    从零开始学习UCOSII操作系统1--UCOSII的基础知识


    前言:

    首先比较主流的操作系统有UCOSII、FREERTOS、LINUX等,UCOSII的资料相对比其余的两个操作系统的资料是多很多的。

    更重要的原因是自己本身还没有能力深入的研究Linux操作系统。本次学习UCOSII主要是学习内核的设计原理。

    此次专栏涉及到的API的使用是非常小的,仅仅作为本人学习的记录。后期也会对比UCOSIII说出实现的更多功能的代码。


    参考书籍:《嵌入式实时操作系统μCOS-II原理及应用》、《嵌入式实时操作系统uCOS-II 邵贝贝(第二版)》

    学习代码的出处:http://bbs.elecfans.com/jishu_345856_1_1.html


    1、操作系统的作用

    操作系统是计算机硬件系统与应用程序之间的接口,应用程序设计人员只是以操作系统层为基础使用计算机系统,所以程序设计人员

    看到和使用的只是一些由计算机操作系统所提供的函数API,至于操作系统的这些底层函数是怎么实现的,作为一个应用开发人员是不需要

    管的。


    2、嵌入式系统的特点:

    (1)专用性强:嵌入式系统通常是面向某个特定的应用的,所以嵌入式系统的硬件是特定用户群来设计的

    (2)可以裁剪:Linux系统有很多网络协议栈之类的,有些做个数码相框的,没有必要的话,那么直接把那段源码去掉也是可以的

    (3)实时性与可靠性:所谓的实时性不是指,你代码写的东西必须要马上执行,而是你写的代码可以

    在合适的时间中执行,因为操作系统有很多机制,比如资源的强占,优先级低的任务是不可能实现

    只要申请资源就马上得到的。



    3、裸机和操作系统最大的区别:

    裸机是在一个main函数中不断的执行,除了有中断才会跳转到别的相应的代码中执行的。不然运行的指针就会按照

    地址的不断的加4来执行。顺序的执行结构,就是你可以通过代码的找到相应的执行流程。


    操作系统之后,main函数,当通过函数堆栈切换的跳转到第一个任务之后,通过优先级的判断

    优先级高的任务可以得到优先的执行,就好像有多个main函数在一起执行的假象(并行)



    4、任务的C语言表示:

    任务是不需要返回的无类型函数。

    void  task1(void * param)
    {
    	for( ; ;)
            {
                                 //用户编写的代码
            }
    }

    当然有人就觉得奇怪了,为什么你在一个函数里面添加一个死循环,那么函数不会就在这个任务中不断的执行吗?

    当然这需要在里面添加中断的代码的,以便于它能跳转到其他的任务中执行,切换任务的时候,判断优先级进行任务之间的切换的工作。



    5、嵌入式实时操作系统的基本功能:

    (1)内存管理:

    内存管理主要是动态内存的管理,当应用程序需要使用内存的时候,可以利用操作系统所提供

    内存分配函数来获得足够的内存空间。

    动态内存就是指malloc、free函数的分配,就是从堆里面拿内存,因为我们本来嵌入式系统的内存分配就比较

    少,所以这里很关键。


    (2)多任务管理:

    裸机就是一个单任务的前后台的程序,就是一个任务加上中断的机器的实现方法。

    程序设计人员就可以按照多线程来设计自己的程序,程序的耦合性和单元测试方面就会比较的容易。

    关键就是程序的可复用性会更加的好。


    (3)外围资源管理:

    除了本身自己必须需要的东西,内存和CPU,还有很多输入型设备和输出型设备需要管理。

    由于资源是有限的,因此操作系统必须对这些资源进行合理的调度和管理,才能保证每个要使用

    资源的任务在运行时可以获得足够的资源。


    6、UCOS的代码结构:

    这个是UCOS的代码结构,首先我们认识一个东西,需要从它的整体分析一下,因为有一些东西

    我们是在UCOS中不需要深入理解的。

















    展开全文
  • UcosII

    2016-11-24 16:08:03
    ucosII就是一个对这些任务进行调度管理的多任务操作系统 任务存储角度来说:三个部分: 任务类型 用户任务,实现某种功能 系统任务,为应用程序提供服务 任务链表: 任务状态 用户...

    嵌入式操作系统的基本概念

    操作系统的功能

    - 处理器的管理(中断,处理器调度)
    - 存储的管理
    - 设备的管理
    - 文件的管理
    - 网络通信的管理
    - 提供用户接口
    

    嵌入式系统和嵌入式操作系统

    嵌入式系统基本要素和特点

    基本要素

    - 嵌入
    - 专用
    - 计算机系统
    

    特点

    - 专用性强
    - 可裁剪性好
    - 实时性与可靠性好
    - 功耗低
    

    典型结构

    #

    实时操作系统

    • 实时系统的计算必须产生正确的结果,逻辑或功能正确
    • 实时系统的计算必须在预定的周期内完成,成为时间正确

      硬实时操作系统
      软实时操作系统
      
    • 需要满足三个条件

      实时操作系统必须是多任务系统
      
      
      任务的切换时间应与系统中的任务数无关
      

      中断延迟的时间可预知并尽可能短
      
          为了是应用程序的设计者可以计算出系统完成某一个任务的准确执行时间
          要求作为进行任务切换的调度器的运行时间应该是固定的,即调度器进行任务切换的时间不能受应用程序中其他因素(如任务数目)的影响。
      

    分式操作系统

    ucosII

    体系结构:

    us/os-II的任务

    任务的基本概念

    任务就是一个线程,由C语言函数和相关的一些结构体构成的实体。ucosII就是一个对这些任务进行调度管理的多任务操作系统
    任务存储角度来说:三个部分:

    任务类型

    用户任务,实现某种功能

    系统任务,为应用程序提供服务

    任务链表:

    任务状态


    用户任务代码一般结构

    带有临界段的无限循环,

    用户应用程序的一般结构



    OSTaskCreat()为操作系统提供的用来创建任务的,OSStart为操作系统提供的启动个任务的,之后就交给操作系统进行调度管理了。

    系统任务

    空闲任务:系统没事可做的时候跑的。
    统计任务:统计CPU的空占比

    优先级别

    64 最后两个已经被占用 空闲任务和统计任务

    任务堆栈

    每个任务有一个自己的堆栈,互不干扰。在存储器里面一段按照FIFO规则使用的空间。

    创建

    `#define TASK_STK_SIZE 512 //堆栈长度 9512*2)Byte
     OS_STK_TaskStk[TASK_STK_SIZE]//定义数组为任务堆栈 `
    

    创建任务时候,将任务栈顶指针传过去 OS_STK *pto
    堆栈增长方向不同,创建栈的写法不一样
    OSTaskCreate(MyTask, &MyTaskAgu,&MyTaskStk[0],20);

    任务堆栈初始化

    操作系统负责,CPU从堆栈中获得关键恢复数据(任务指针 任务堆栈指针 程序状态字)事先存放在任务的堆栈中,当任务获得CPU的使用权时候,就可以把对战中的初始数据赋值到CPU的各个寄存器中,任务顺利启动并运行。

    任务的控制块与任务控制链表

    OS_TCB是用来记录任务堆栈指针、任务当前状态、任务优先级别……与任务管理有关的属性。
    控制链表吧系统所有任务的控制块链接为两条链表,并进行管理,控制任务快进行相关操作。

    任务控制块结构

    结构类型数据,创建函数时候赋值并留在RAM中
    结构定义:

    任务控制块链表


    任务控制块的初始化

    创建任务时候,任务控制块也会被赋值

    任务就绪表及任务调度

    调度就是通过一个算法来确定多个任务中的哪个任务来执行,调度器来做这个事情,要保证就绪状态的所有任务中优先级别最高的任务来执行,根据任务就绪表

    结构

    操作

    任务调度

    有规矩的任务切换:

            找就绪任务
            任务切换
    
    • 获得就绪任务的TCB
      被终止任务的任务控制块指针存放在全局变量OSTCBCur中,所以调度器这部分的工作主要是获得带运行任务的控制块指针。

    • 任务切换

      OSCtxSw() 完成任务切换功能,实现无缝切换
      

    任务的创建

        创建任务的实质是创建任务控制块,使刚创建的任务进入就绪状态,并接着来一次任务调度。
    
    
        一般来说,任务可以在函数OSStart()之前进行创建,但必须在之前已经创建了一个任务,并赋予它最高优先级别。
    

    任务的挂起和恢复

    挂起一个任务就是停止这个任务的运行

    其他任务管理函数

    ucosII的初始化和任务的启动


    示例

    uc/os-II的中断和时钟

    任务的同步与通信

    信号量级

    内存的动态分配

    uc/os-II可裁剪性的实现

    展开全文
  • ucosii

    2016-03-09 17:10:17
    如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求...

     如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。


    OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)

    等待一个信号量函数(信号量指针、允许等待的时钟节拍、代码错误指针)

    描述:等待一个信号量
    参数:pevent:指向事件控制块结合目标信号量的指针
                timeout:定时超时选项(以时钟节拍为单位),如果非零,你的任务将等待
                                 //资源的时间值就是这个参数,如果为零,将永远等待直到资源变成可用(或者其它事件发生)
                err   指向错误代码的消息指针
          *       消息为:
          *
          *       OS_NO_ERR   调用成功,任务拥有资源或者目标事件发生
          *       OS_TIMEOUT   规定时间内信号量没有发生
          *       OS_ERR_EVENT_TYPE 如果没有传递指针到信号量
          *       OS_ERR_PEND_ISR  如果ISR调用此函数,结果将异常
          *       OS_ERR_PEVENT_NULL 如果 'pevent' 是一个空指针




    邮箱的使用就是:



       在建立邮箱后,在任务一中把这个任务中的一个局部变量a的地址,通过函数OS_MboxPost发送到邮箱里面,然后在任务二里面建立一个指针p,通过OS_MboxPend()把任务一发送的消息(a的地址)赋值给指针p,然后在任务一里面通过访问p的内容就是访问任务一的变量a。当任务切换时任务中的局部变量会保存在自己的堆栈中,因此a的地址还是不变的,这时通过邮箱传递a的内容是没有问题的,但是如果当在一个中断服务函数中调用OS_MboxPost时,发送中断服务函数中的局部变量的地址就需要注意,这个变量必须定义成static型局部变量或者采用全局变量。不然这个局部变量的地址会因为中断的退出而改变。



    展开全文
  • UCOSII操作系统1–UCOSII的基础知识 前言: 目前比较主流的操作系统有UCOSII、FREERTOS、LINUX等,UCOSII的资料相对比其余的两个操作系统的资料还是非常全面的。 此次专栏涉及到的API的使用是非常小的,仅仅作为本人...
  • UCOSii入门教程

    2021-01-14 20:08:10
    UCOSii入门教程
  • UCOS II源码

    2017-02-20 18:20:39
    UCOS II源码
  • uCOSII移植

    2016-10-27 08:22:20
    uCOSII移植
  • 1、初始化UCOSII (1)在调用UCOSII在任何的其他的服务之前,UCOSII要求首先调用初始化函数OSInit();这个函数的目的就是在整个系统启动之前,初始化所有的变量和数据结构。 (2)其中,在OSInit()函数中建立空闲任务OS_...
  • UCOSII简介
  • ucosII和ucosIII

    2018-01-17 14:11:50
    压缩包包含ucosII 和 ucosIII 两种源码,供网友在要源码移植时下载使用,均是本人在www.micrium.com下载的原压缩包。
  • 从零开始学习UCOSII操作系统3--UCOSII启动过程 1、初始化UCOSII (1)在调用UCOSII在任何的其他的服务之前,UCOSII要求首先调用初始化函数OSInit();这个函数的目的就是在整个系统启动之前,初始化所有的变量和数据...
  • ucosii 使用技巧

    2020-07-22 13:40:13
    本文主要说明了ucosii 使用技巧。
  • UCOSII操作系统2–UCOSII的内核实现 参考书籍:《嵌入式实时操作系统μCOS-II原理及应用》、《嵌入式实时操作系统uCOS-II 邵贝贝(第二版)》 1、任务的结构–任务控制块 首先这个任务控制块是非常的大的,这里面使用...
  • 1.ucosii stm32F10X系列的都可以用, 2.带os_cpu_c.c os_cpu_a.asm os_cpu.h处理器相关代码,支持IAR,MDK编译器, 3.带includs.h 在C:\Micrium_uC-Eval-STM32F107_uCOS-II\Micrium\Software\EvalBoards\Micrium\uC-...
  • 压缩包里面是ucosii和ucosiii的官方资料: 100-uC-OS-II-002.pdf 100-uC-USB-D-Renesas-RX63N-001.pdf 100-uCOS-II-Freescale-Kinetis-001.pdf 100-uCOS-III-NXP-LPC1768-001.pdf 600-uCOS-III-UsersGuide-004.pdf ...
  • UCOSII 资料 源代码

    2020-12-20 21:17:21
    UCOSII 资料 源代码
  • ucosii 定时器说明

    2018-09-05 13:15:41
    ucosii 定时器详细说明
  • lwip_lpc:包括contrib-1.4.0、lwip-1.4.0、nxpcommon。还附带一个uCOSII下LwIP协议的移植实现的pdf文档
  • UCOS II 源码

    2018-06-30 09:49:48
    搬运的UCOS II源码和在PC上移植的工程,有EX1_x86L,EX2_x86L,EX3_x86L,EX4_x86L,FPIx86L,Ix86L-FP仅供参考
  • STM32 ucosii MQTT

    2020-05-16 12:27:43
    ucosii lwip 下移植Mqtt ,非w5500 独立网口移植MQTT ,ucosii下运行,移植了LWIP,支持tcp和udp,独立任务运行MQTT,支持阿里云
  • UCOSII.zip

    2020-11-11 22:06:32
    ucosii修改后的源码,具有任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能,供大家参考
  • UART_UCOSII.rar

    2020-04-12 11:52:19
    ucosii源码完整,可用sourceinsight等查看,可用于学习ucosii任务管理。
  • 从零开始学习UCOSII操作系统2--UCOSII的内核实现

    万次阅读 多人点赞 2018-03-25 19:15:19
    从零开始学习UCOSII操作系统2--UCOSII的内核实现参考书籍:《嵌入式实时操作系统μCOS-II原理及应用》、《嵌入式实时操作系统uCOS-II 邵贝贝(第二版)》1、任务的结构--任务控制块首先这个任务控制块是非常的大的,这...
  • ucosii 消息队列

    2016-07-17 22:44:14
    ucosii 消息队列
  • ucosii_demo

    2016-03-16 02:04:16
    ucosii_demo
  • VS2013+uCOSII V2.91(uCOSII移植)

    千次阅读 2016-10-27 08:27:04
    最近在看任哲的《嵌入式实时操作系统原理及应用》,看了前面8...uCOSII既然是用C写的可移植实时操作系统,能不能移植到PC上用VS编译呢。于是就在网上搜索了一下,果然有前辈开路。 下面开始讲述怎么把uCOSII移植到VS20
  • ucosII操作系统.png

    2020-03-07 14:42:39
    基于stm32的ucosii知识要点,描述了ucosII的知识概念,系统滴答的作用,操作系统的通信机制,怎么编写代码.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,361
精华内容 1,744
关键字:

ucosii