首页 > 嵌入式软件 > Uc/os II

使用操作系统,就要使用操作系统相关的资源(消息邮箱、信号量、互斥信号量、消息队列、事件等),需要大致了解系统内核原理。

本文引用地址: http://www.21ic.com/embed/software/ucos/201801/50278.html

uC/OS-ii操作系统配置

uC/OS-ii系统配置就是修改os_cfg.h文件,就是使能或失能某些功能,即系统裁剪(使能开关量)。

系统的裁剪是通过预处理(配置了就编译,没配置就不编译)实现的,预处理直接影响程序编译的大小。

2. 主函数描述

main函数在裸机和操作系统中都是存在的,main函数是程序的入口函数,uC/OS-ii操作系统中重要的三个函数:

OSInit操作系统初始化;

OSTaskCreate创建任务;

OSStart启动任务

(1) void OSInit (void)系统初始化函数

函数体位于os_core.c文件中。操作系统初始化就是对uC/os-ii系统的初始化,其中包括内核与系统资源的初始化,

void OSInit (void)

{

OSInitHookBegin(); /* Call port specific initialization code系统初始化开始Hook函数 */

OS_InitMisc(); /* Initialize miscellaneous variables初始化各变量 */

OS_InitRdyList(); /* Initialize the Ready List初始化就绪列表 */

OS_InitTCBList(); /* Initialize the free list of OS_TCBs 初始化任务控制块 */

OS_InitEventList(); /* Initialize the free list of OS_EVENTs初始化事件控制块 */

#if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)

OS_FlagInit(); /* Initialize the event flag structures初始化事件标志组 */

#endif

#if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u)

OS_MemInit(); /* Initialize the memory manager初始化内存管理 */

#endif

#if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u)

OS_QInit(); /* Initialize the message queue structures初始化消息队列 */

#endif

OS_InitTaskIdle(); /* Create the Idle Task 创建空闲任务 */

#if OS_TASK_STAT_EN > 0u

OS_InitTaskStat(); /* Create the Statistic Task 创建任务 */

#endif

#if OS_TMR_EN > 0u

OSTmr_Init(); /* Initialize the Timer Manager */

#endif

OSInitHookEnd(); /* Call port specific init. code */

#if OS_DEBUG_EN > 0u

OSDebugInit();

#endif

}

前五个函数是系统内核必须初始化部分,有选通开关的时根据系统配置决定是否需要初始化的部分。

系统配置在此处体现出来。如:没有使能“事件标志”即没有使能该选项,那么程序也不会初始化事件标志组。

必须类:

与系统、任务紧密相关的初始化。这些初始化就是对变量、结构体等赋初始值。(如:系统运行标志位初始化暂停运行、最高优先级指空等)它们的初始化位于系统内核os_core.c里面。

非必须类:

代码前面有一个预处理标志位(选通开关),这些标志位位于os_cfg.h中,当不需要使用这些功能时,它们不会被初始化。

事件标志组、内存管理、消息队列等这些属于非必须类,它们的初始化位于自身的.c文件中(不位于os_core.c)。

[OS_FlagInit位于os_flag.c文件里面]

(2) OSTaskCreate创建任务函数

该函数体位于os_task.c文件中。创建任务主要是配置及初始化任务入口、任务相关的堆栈、优先级、以及检测参数的正确性等。

#if OS_TASK_CREATE_EN > 0u //系统配置使能

INT8U OSTaskCreate (void (*task)(void *p_arg),

void *p_arg,

OS_STK *ptos,

INT8U prio)

{

OS_STK *psp;

INT8U err;

#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register若临界模式=3u,则给CPU_SR分频空间*/

OS_CPU_SR cpu_sr = 0u;

#endif

#ifdef OS_SAFETY_CRITICAL_IEC61508

if (OSSafetyCriticalStartFlag == OS_TRUE) {

OS_SAFETY_CRITICAL_EXCEPTION();

}

#endif

#if OS_ARG_CHK_EN > 0u

if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range确保优先级在指定范围内 */

return (OS_ERR_PRIO_INVALID);

}

#endif

OS_ENTER_CRITICAL();

if (OSIntNesting > 0u) { /* Make sure we don't create the task from within an ISR确保我们不会从ISR中创建任务 */

OS_EXIT_CRITICAL();

return (OS_ERR_TASK_CREATE_ISR);

}

/*确保任务优先级未被使用,即就绪态为0*/

if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */

OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... */

/* ... the same thing until task is created.保留这个优先级,防止再次创建相同优先级任务*/

OS_EXIT_CRITICAL();

psp = OSTaskStkInit(task, p_arg, ptos, 0u); /* Initialize the task's stack */

err = OS_TCBInit(prio, psp, (OS_STK *)0, 0u, 0u, (void *)0, 0u);

if (err == OS_ERR_NONE) {

if (OSRunning == OS_TRUE) { /* Find highest priority task if multitasking has started */

OS_Sched();

}

} else {

OS_ENTER_CRITICAL();

OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */

OS_EXIT_CRITICAL();

}

return (err);

}

OS_EXIT_CRITICAL();

return (OS_ERR_PRIO_EXIST);

}

#endif

注意:在os_cfg.h文件的任务管理中需要使能“创建任务”

即需要配置:

#define OS_TASK_CREATE_EN 1u /* Include code for OSTaskCreate() 创建任务 */

换一批

延伸阅读

[新鲜事] 太淘气了!俄罗斯机器人两次私自逃离实验室将被拆解

太淘气了!俄罗斯机器人两次私自逃离实验室将被拆解

在威尔史密斯的电影《机械公敌》中,一个人工智能机器人因为有了自己的思想,在人类社会中造成了极大的混乱,如今机器人拥有智能这一现象在俄罗斯真实上演了,这个机器人两度私自逃出了实验室,第一次因为电量耗完被搁置在马路中间,第二次逃走未遂,实验室准......

关键字:俄罗斯 机器人 人工智能

[趣科技] 厉害了!这款咖啡无人机能配送,还能预测何时想喝咖啡......

厉害了!这款咖啡无人机能配送,还能预测何时想喝咖啡......

北京时间8月23日早间消息,IBM刚刚获得了一项咖啡无人机专利,不仅能配送咖啡,还可以预测某人何时需要咖啡。根据IBM提交给美国专利和商标局的文件,这款设备可以用在办公室、咖啡厅或活动现场,将预订的咖啡投递送......

关键字:咖啡 无人机

[真心话] 资深硬件研发工程师:抄袭可耻!但产品抄袭可用,资料抄袭可笑

资深硬件研发工程师:抄袭可耻!但产品抄袭可用,资料抄袭可笑

硬件研发一般是指电子产品硬件研发,是一种看得见实物的电子产品研发,比如我们所说的手机、鼠标、键盘、音响都是硬件,硬件开发也就是在这些方面进行的一系列研究。本文分享一位资深工程师对硬件研发的一些看法,希望能对大家有所帮助。......

关键字:硬件研发 抄袭 生产体系
条评论

我 要 评 论

网友评论

大家都爱看

  • 扇出型晶圆级封装的优势和挑战!

    我们有能力创造一些能保持前代性能并且更好更小的电子设备,例如今天的可穿戴设备、智能手机或平板电脑,这是由于很多因素超过摩尔定律而快速发展,从而能够从底层的嵌入组件发展到今天把它们封…

    2018-03-29
  • Xilinx推出革命性的新型自适应计算产品

    自适应和智能计算的全球领先企业赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX)),近日宣布推出一款超越FPGA功能的突破性新型产品,名为ACAP(Adaptive Compute Acceleration Platform,自适应计算加速…

    2018-03-20
  • 赛普拉斯为树莓派3 B+ IoT单板计算机提供强大稳定的无

    先进嵌入式系统解决方案的领导者赛普拉斯(纳斯达克代码:CY)近日宣布其Wi-Fi®和蓝牙®combo解决方案为全新的树莓派 3 B+(Raspberry Pi 3Model B+)IoT单板计算机提供强大稳定的无线连接…

    2018-03-20
  • 观看直播领红包,SEED-A10加速卡助力人工智能

    随着云服务器、云计算的发展,大家对硬件加速的需求越来越多,但是随着设备功耗的上升、性能需求越来越高,常规加速设备以及开始不能满足需求,因此FPGA逐渐在硬件加速中找到了自己的位置,而艾…

    2018-03-19
  • 特朗普:博通不得以任何形式收购高通

    白宫周一(3月12日)晚发出声明,川普(特朗普)总统出于“国家安全”考量、禁止新加坡博通公司(Broadcom)收购美国高通公司(Qualcomm)。

    2018-03-14