• uCOS整体初步了解


    首先在main函数中调用OSTaskCreate的理解。
    OSTCBPrioTbl
     
    OSTaskStkInit() 设置堆栈
    OS_TCBInit()TCB任务控制块初始化
    OS_Sched()任务调度
     
    在OS_Sched中,OS_SchedNew()函数负责找到新的最高优先级的
    任务,并赋值给OSPrioHighRdy
         OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
    这行语句中的三个全局变量都是实现任务切换的优先级判断的关键。
    OS_TASK_SW()宏定义,因为C不能操作寄存器,所以对于任务的切换是由这个宏定义,定义的汇编代码实现。
    这个宏定义展开是汇编代码。
     
    这些由uS/OC的书中的第三章都可以更详细的获得。
     
    OS_ENTER_CRITICAL();
    OS_EXIT_CRITICAL();
    uC/OS中用来实现,开关中断的一组宏定义。当调用功能函数时,必须关闭中断。
     
    uC/OS中的互斥操作是由信号灯机制来实现的,
    OSSemCreate函数创建信号灯。
    OSMutexCreate
     
    uC/OS中的任务间通信机制
    分为邮箱和队列。
    OSMboxCreate()创建一个邮箱
    OSQCreate()创建一个队列。
     
    他们传递的都是一个指针,队列可以看做是一组邮箱构成的数组,只不过他们是由相同的任务控制。
    这里的指针可以是一个变量的地址,也可以是一个结构体变量的地址。
    因为指针的存在,实现了不同任务间,大量数据的传输。
     
    OSStart()函数开启us/os中真正多任务的开始。
    没有返回。
    OS_SchedNew();找到最高优先级,
    OSStartHighRdy();通过汇编代码,跳转到需要的地方执行,此时系统才开始真正运行起来。
     
    uC/OS的任务切换是通过汇编代码实现的,
    这里边使用的是
    中断切换。
    所有的切换代码是在
    os_cpu_a.asm中,
    依靠系统的时钟中断,
    触发任务切换,实现当前任务的寄存器入栈及下一个将要运行任务的寄存器出栈,
    完成切换。
  • 相关阅读:
    【C语言】C语言static和extern区别
    【C语言】C语言外部变量和内部变量
    【C语言】C语言局部变量和全局变量
    【C语言】C语言常量和变量
    【C语言】C语言数据类型
    【C语言】C语言标识符
    【C语言】C语言关键字
    【C语言】外部函数和内部函数
    【C语言】C语言函数
    Android 测试 Appium、Robotium、monkey等框架或者工具对比
  • 原文地址:https://www.cnblogs.com/skl374199080/p/3107717.html
Copyright © 2020-2023  润新知