uCOS-III阅读,第一天,也就瞎看看

来源:互联网 发布:dj舞曲视频软件 编辑:程序博客网 时间:2024/05/21 10:39

写在前面的注释

  • 本文是作者自己阅读uCOS的笔记,刚刚开始,逻辑混乱,以后可能会修改,不过以我的性格,难!!!

    传到晚上只是想借用网络资源储存,谢谢

网上搞的

材料

  1. 下载了stm32f103的固件库
  2. 寻找一个stm32f107的ucos III的移植好的例子1.2x版本的

移植

  • 移植方面因为抄的是别人的例子,所以比较简单。主要是构建一个自己习惯的文件夹目录。

初探Main函数

  • Main函数中的主要函数

    int main(void){    BSP_IntDisAll();    OSInit(&err);    CPU_Init();    BSP_Init();    OS_CPU_SysTickInit(cnts);    OSTaskCreate(……);    OSStart(&err);}
  • Main函数中做的几件事儿

    a. BSP_IntDisAll(),屏蔽MCU的中断

    b. OSInit(&err),从字面上理解是初始化OS相关的东西,猜猜看应该是一些全局变量、标志之类;等以后慢慢看。

    c. CPU_Init(),这个东西暂时看不出是啥,过

    d. BSP_Init(),这是一个板级的初始化工作,设置一些MCU的外设等

    e. OS_CPU_SysTickInit();设置MCU的滴答计时器,向系统提供工作计时。

    f. OSTaskCreate();创建APP任务。

    g. OSStart(&err),开始系统运行。

简单的瞅一眼

BSP_IntDisAll()

  • 函数调用路线:

    BSP_IntDisAll() ->CPU_IntDis() ->CPU_IntDis【Cpu_a.asm中的标号】:执行伪指令 CPSID I 来屏蔽所有中断信号

OSInit(&err)

对OS系统的全局变量进行初始化,并创建中断消息队列分发任务,uCos中优先级最高的任务

+ OSInitHook()

实际的工作是设定CPU的异常中断堆栈:

OS_CPU_ExceptStkBase = (CPU_STK *)(OSCfg_ISRStkBasePtr + OSCfg_ISRStkSize - 1u);

当OS_CFG_ISR_STK_SIZE > 0 时有效,具体值可以根据CPU的中断处理需求调整;典型值128U。

OS_CFG_ISR_STK_SIZE 在 Os_cfg_app.h中配置
+ OSIntNestingCtr

记录CPU的当前中断嵌套的层数,os,清零了。
+ OSRunning

OS运行状态的标志位,此时OS没有开始运行,初始化为OS_STATE_OS_STOPPED。
+ OSSchedLockNestingCtr

任务调度器的锁,大于0时,调度器锁定
+ 接下来清除调度器锁定时间计数和选择是否采用循环调度算法(?)
+ 清空异常处理堆栈
+ 清除app的hook函数指针,hook函数是用来在正常OS过程中插入用户方法的一种办法(?)
+ OS_PrioInit()

清零任务优先级表OSPrioTbl[OS_PRIO_TBL_SIZE],该表中的每一个位代表一个优先级,该表是表示优先级下有无任务就绪的位图(?)。
+ OS_RdyListInit()

OS 会根据任务优先级的数目(OS_CFG_PRIO_MAX)为每一个优先级建立一个就绪任务链表,此处将链表初始化为空链表。
+ OS_TaskInit()

清空OSTaskQty OS任务计数和OSTaskCtxSwCtr OS上下文切换计数
+ OS_IntQTaskInit()

初始化中断队列处理任务,从数据结构讲,中断队列是一个环状单向链表,元素个数由OS_CFG_INT_Q_SIZE > 2定义,作用是创建中断消息队列处理任务

通过OS_CFG_ISR_POST_DEFERRED_EN来选择消息队列延迟发布功能

  • OS_IdleTaskInit(*p_err)

    空闲任务,服务函数OS_IdleTask。
  • OS_TickTaskInit(*p_err)

    滴答时钟任务,包含一个延时任务列表,服务函数OS_TickTask。
  • OS_StatTaskInit(*p_err)

    CPU使用状态统计任务,服务函数OS_StatTask。
  • OS_FlagInit(*p_err)

    清空Flag计数
  • OS_MemInit(*p_err)

    清空Memory 计数
  • OS_MsgPoolInit(*p_err)

    创建消息池,设定初始地址,和数量
  • OS_MutexInit(*p_err)

    清零互斥信号量
  • OS_QInit(*p_err)

    清空队列计数
  • OS_SemInit(*p_err)

    清空信号量个数
  • OS_TmrInit(*p_err)

    创建OS计时任务,该计时是由滴答计时器分频得到,滴答计时器的典型值是1000Hz,OS计时器的典型值为10Hz;初始化时钟队列(一个指向延时链表的指针链表,节点的数量应为质数,默认17;服务函数:OS_TmrTask(),优先级OS_CFG_PRIO_MAX-2u)。
  • OS_Dbg_Init()
  • OSCfg_Init()

    上面两个函数只是确保调试变量都被使用一次,来禁止编译器报错的。
0 0