启动ucosii之五OSStart()

【uCOS-II学习笔记2】任务调度,触发执行上下文切换 uC/OS-II学习-PART 2 阅读详情

函数原型来自OS_CORE.C

//该函数由SStart()函数调用,功能是运行优先级最高的就绪任务,在调用OSStart()之前,用户必须先调用OSInit(),并且已经至少创建了一个任务.
//OSStartHighRdy()默认指针OSTCBHighRdy指向优先级最高就绪任务的任务控制块(OS_TCB)(在这之前OSTCBHighRdy已由OSStart()设置好了).
void  OSStart (void)//通过这个函数,开始多任务
{
 INT8U y;
 INT8U x;
    //确保操作系统没有在运行
    if (OSRunning == FALSE) {
 //获取任务就绪表中就绪的最高优先级
        y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
        x             = OSUnMapTbl[OSRdyTbl[y]];
        OSPrioHighRdy = (INT8U)((y << 3) + x);
        OSPrioCur     = OSPrioHighRdy;
 //指向就绪的最高优先级的任务控制块
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
        OSTCBCur      = OSTCBHighRdy;


//_OSStartHighRdy(),实际核心代码采用汇编语言编写在Os_cpu_a.asm中.
        OSStartHighRdy();                            /* Execute target specific code to start task     */
    }
}

奋斗

函数原型来自OS_CPU_A.ASM
为了启动任务,OSStartHighRdy()从任务控制块(OS_TCB)中找到指向堆栈的指针,然后运行POP DS/ POP ES/ POPA  和 IRET

_OSStartHighRdy  PROC FAR

            MOV    AX, SEG _OSTCBHighRdy          ; Reload DS
            MOV    DS, AX                         ;
;
            CALL   FAR PTR _OSTaskSwHook          ; Call user defined task switch hook
;
            MOV    AL, 1                          ; OSRunning = TRUE;
            MOV    BYTE PTR DS:_OSRunning, AL     ;   (Indicates that multitasking has started)
;
            LES    BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
            MOV    SS, ES:[BX+2]                  ;
            MOV    SP, ES:[BX+0]                  ;
;
            POP    DS                             ; Load task's context
            POP    ES                             ;
            POPA                                  ;
;
            IRET                                  ; Run task

_OSStartHighRdy  ENDP

ucos进入OSStartHang死循环的问题 大家在移植ucos到stm32后,尝试跑多任务程序很容易发现卡死了情况,debug可以看到是卡死在OSStartHang这里如下图1-1,并且该地方后面还备注了不应该到达这里。其实这个问题很简单就是ucos异常中断服务程序没有正确被调用,那么为什么没有被正确调用呢? 图1-1 其实异常中断服务程序在ucos的源码都定义好了名... 阅读详情

相关推荐

GD32F303移植UCOSII实战:从原理到代码详解

实时操作系统(RTOS)是嵌入式开发中管理多任务、提升系统可靠性的核心技术,其核心原理在于任务调度、中断管理和资源同步。通过抢占式调度和确定性响应,RTOS能够有效解耦复杂应用逻辑,特别适用于工控、物联网等对实时性要求高的场景。本文以经典的UCOSII实时操作系统为例,结合**GD32F303**微控制器,深入讲解RTOS移植的底层机制与工程实践。内容涵盖Cortex-M4内核的PendSV异常利用、任务上下文切换的汇编实现、以及针对**国产MCU**的资源优化配置,为开发者提供从理论到实战的完整指导,帮助

aoe41606的博客 382

OSStartHighRdy()

µC/OS-II 的移植需要用户改写OS_CPU_A.ASM中的四个函数: OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR()该函数由SStart()函数调用,功能是运行优先级最高的就绪任务,在调用OSStart()之前,用户必须先调用OSInit(),并且已经至少创建了一个任务(请参考OSTaskCreate()和OSTaskCreateExt

FunkyFrog821951259的博客 6777

GD32F303移植UCOSII实战:从Cortex-M4内核适配到多任务调度

实时操作系统(RTOS)是嵌入式开发中管理复杂多任务系统的核心技术,其核心原理在于通过任务调度、中断管理和资源同步机制,实现确定性的响应与高效的资源利用。在资源受限的微控制器(MCU)上,RTOS能显著提升代码结构清晰度与可维护性,尤其适用于需要同时处理传感器数据、人机交互和通信协议的物联网设备或工业控制器。本文以经典的UCOSII实时操作系统为例,结合Cortex-M4内核的异常处理机制与系统滴答定时器(SysTick)配置,详细解析如何将其移植到兆易创新GD32F303系列MCU。通过适配任务堆栈初始化

weixin_30825199的博客 380

stm32 ucos/ii移植,程序执行到OSStart()内部的OSStartHighRdy()语句时跑飞问题解决方法之一

@[TOC](stm32 ucos/ii移植,程序执行到OSStart()内部的OSStartHighRdy()语句时跑飞问题解决办法之一) 网络上的一些解决办法: stm32程序遇到OSStartHang的问题解决方法总结 但并不适合我遇到的情况。 我的情况是已经能够正确的运行程序切换,然后增加一了个任务,并在任务中实现信号量的请求。同时在原有任务中增加信号量的发布,用来验证信号量功能。 增加信号量请求功能后,程序就不再正常,用调试方式单步运行时,程序总是崩溃在OSStartHighRdy汇编语言处,

gsm197851的博客 2335

UCOSII实时操作系统启动原理和理解

1,ucos系统的任务表示: 需要在里面添加中断的代码的,以便于它能跳转到其他的任务中执行,切换任务的时候,判断优先级进行任务之间的切换的工作。 void task1(void * param) 当调用 OSStart()时,OSStart()从任务就绪表中找出那个用户建立的优先级最高任务的任务控制块。Start()调用高优先级就绪任务启动函数 OSStartHighRdy()[(2)],这个文件与选择的微处理器有关。函数 OSStartHighRdy()是将任务栈中保存的值弹回到CPU 寄存器中,然后执行

wangjie36的博客 2457

避坑指南:QCustomPlot鼠标事件冲突解决方案(左键拖动vs右键框选)

本文深入解析QCustomPlot在QT框架下的高级交互实现,重点解决左键拖动与右键框选的冲突问题。通过自定义事件处理和QRubberBand技术,提供了一套完整的无冲突交互方案,帮助开发者优化数据可视化应用的用户体验。

moss5的博客 660

【UCOSii源码解读】UCOSii启动流程以及平台相关文件分析

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 其实在一年多以前我就已经萌生了去写一下UCOSii的源码解析的想法,但是无奈当时水平有限,就算写了恐怕也只是表面上API的应用而已,这一次我向写一些对于UCOS更深层次的理解。其实在我看来所有的RTOS都具有十分类似的框架结构,只是其中填入的算法不同而已。其中最为核心的也就是一个优先级算法,以及调度算法。 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二.

yy197696的博客 1956

【实战指南】利用CAN适配器高效调试CAN总线通信

本文提供了一份利用CAN适配器高效调试CAN总线通信的实战指南。文章从硬件连接、终端电阻配置、软件参数设置等基础环节入手,详细解析了CAN适配器作为关键调试工具的工作原理与使用方法,并针对常见的通信故障提供了系统化的问题排查思路,帮助工程师快速打通通信链路,提升调试效率。

weixin_28285943的博客 412

UCOSII操作系统 第3课—UCOSII启动过程

1、初始化UCOSII (1)在调用UCOSII在任何的其他的服务之前,UCOSII要求首先调用初始化函数OSInit();这个函数的目的就是在整个系统启动之前,初始化所有的变量和数据结构。 (2)其中,在OSInit()函数中建立空闲任务OS_TaskIdle(); 这个任务总是处于就绪态的,空闲任务的优先级是设置为最低的。 (3)调用OSInit以后,任务控制块缓冲池中有OS_MAX_TASKS个任务控制块,事件控制缓冲区中有OS_MAX_EVENTS个事件控制块,消息队列缓冲池OS_Q中有OS_MAX

ALong_Lj的博客 746

winget安装提示:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd

当我们使用Winget包管理器安装应用,提示错误:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd 该怎么处理呢?请听我娓娓道来。

Linux I Tell U 8136

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 562

从零开始学习UCOSII操作系统3--UCOSII启动过程

从零开始学习UCOSII操作系统3--UCOSII启动过程 1、初始化UCOSII (1)在调用UCOSII在任何的其他的服务之前,UCOSII要求首先调用初始化函数OSInit();这个函数的目的就是在整个系统启动之前,初始化所有的变量和数据结构。 (2)其中,在OSInit()函数中建立空闲任务OS_TaskIdle(); 这个任务总是处于就绪态的,空闲任务的优先级是设置为最低

李辉的博客 9010

Quartus ||———基于Verilog HDL的数字秒表设计实验

Quartus ||———基于Verilog HDL的数字秒表设计实验一、实验目的二、实验步骤(一)新建工程(二)添加设计文件(三)综合分析与功能仿真1、综合分析2、功能仿真 一、实验目的 用Verilog HDL设计一个数字跑表,所需引脚和功能如下: 二、实验步骤 (一)新建工程 在创建好工程名称后,选定芯片类型 (二)添加设计文件 新建Verilog文件,键入代码如下 module n_clk_top( input clk, input rese

TBMmagic的博客 5525

UCOSII cpu利用率实现原理

目的: 介绍UCOSII中 cpu利用率计算方法 使用方法: 1:在启动任务中调用OSStatInit(); 2:在合适的地方打印OSCPUUsage,就可以得到当前系统cpu的利用率。要特别注意的是系统调用OSStart()后只有3个任务处于 就绪态,分别是 1>启动任务 2>统计任务 3>空闲任务 ...

默默奔跑 1979

【Java核心高阶进阶】44-Java8核心新特性

模块十:Java新特性演进 · 第 1 篇Java 8 是 Java 语言历史上最重要的一次发布,它引入的函数式编程范式从根本上改变了 Java 的编码方式。即便到了 JDK 21 的今天,Lambda、Stream、Optional 仍是日常开发的高频工具。本篇将深入这些特性的语法、原理与底层机制,帮助你不仅会用,更知其所以然。

gaochufukanyongren的博客 24

Vue3 - Element Plus 组件库 Tabs 标签页右侧区域插入按钮,<el-tabs> / <el-tab-pane> 选项卡组件右侧自定义插槽内容教程(右边区域添加自定义按钮功能区)

vue3,elementplus,tabs选项卡如何在插槽按钮,tabs标签页组件怎么自定义右侧内容,vue3elementplustabs组件右侧插槽按钮,element-plus在el-tabs组件的最右侧添加按钮,如何在选项卡右边加入按钮搜索框等内容,哪个属性能在tab选项卡右侧插入自定义按钮,在el-tabs组件最右侧添加按钮,vue3el-tabs组件怎么自定义右侧插槽内容,Tabs标签页右侧自定义插槽,ElementPlusTab右边加按钮,el-tabs组件自定义右侧按钮,在E

🏆 前端领域优质创作者 7016

UCOSII启动流程详解(结合源码分析)

μC/OS-Ⅱ初始化 在调用μC/OS-Ⅱ的任何其它服务之前,μC/OS-Ⅱ要求用户首先调用系统初始化函数 OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构(见 OS_CORE.C)。OSInit()建立空闲任务 idle task,这个任务总是处于就绪态的。空闲任务 OSTaskIdle()的优先级总是设成最低,即 OS_LOWEST_PRIO。

分享人工智能学习心得与实践经验,探讨应用场景,见证变革与进步 9369

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(一)

前言 所谓操作系统,便是隔绝硬件层与应用层的平台,让工程师可以最大限度的忽视硬件,直接进行逻辑开发,它最大的特点,便是可以让多任务并发执行,但并非是同时执行,形象点来说,假如我有4个任务(LED点灯,喇叭鸣叫,串口通信,数据计算),让每个任务都执行几十个毫秒,虽然实际上在任何一个时间点,都有且只有一个任务的一条代码在执行,但是从宏观上看来,这4个任务几乎是同时执行的,这4个任务的调度,就是切换是...

SammySum的博客 722

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

UCOSII操作系统(三)--系统启动过程

1、初始化UCOSII (1)在调用UCOSII在任何的其他的服务之前,UCOSII要求首先调用初始化函数OSInit();这个函数的目的就是在整个系统启动之前,初始化所有的变量和数据结构。 (2)其中,在OSInit()函数中建立空闲任务OS_TaskIdle(); 这个任务总是处于就绪态的,空闲任务的优先级是设置为最低的。 (3)调用OSInit以后 任务控制块 缓冲池中有OS_MAX_TASKS个任务控制块 事件控制 缓冲区中有OS_MAX_EVENTS个事件控制块 消息队列

qq_28445515的博客 897

ucos-ii嵌入式操作系统(三)---系统初始化OSInit和系统启动OSStart

一 概述 前面我们介绍了如何在K60平台上移植第一个ucos系统,我们知道创建一个task并启动它,需要三个函数支持,分别是OSInit、OSTaskCreate以及OSStart,今天我们先来看看OSInit和OSStart分别作了什么。 二 分析 系统初始化OSInit 话不多说,直接先看源代码,如下: void OSInit (void) { #if OS_TASK_CREATE_EX...

myselfzhangji的博客 3221

ucosii的初始化

使用ucosii的所有服务之前,必须调用ucosii的初始化函数OSInit(),对ucosii自身运行环境进行初始化。#include "includes.h" #define MY_TASK_STK_SIZE 512void main(void) { OSInit(); .... OSTaskCreate(MyTask,

weixin_40556262的博客 477

ucosii启动说明

main(){ OSInit(); ------初始化系统的一些变量 ...... OSTaskCreate(MainTask,(void *)0, &MainTaskStk[MainTaskStkLengh - 1], MainTaskPrio); //建立任务 ...... OSStart(); //开始启动任务 } 1、系统的初始化 void OSInit (void) { #if OS_VERSION >= 204 ...

君临 371

uCosII 从 OSStart开始到思维定势··········

我们先看我们的任务代码 TEST.C 1 /******************************Test*******************************/ 2 #include "includes.h" 3 #define TASK_STK_SIZE 512 //任务堆栈长度 4 5 OS_STK MyTaskSt...

weixin_30512043的博客 124

ucosii的系统时钟来源

ucosii的系统时钟来源

qq_38636482的博客 500

uCOS-II内核之初始化及启动

uCOS-II内核之初始化及启动 现在解释下程序编写的依据和实现过程。 在uCOS-II里,在创建一个任务(或者调用其它系统服务之前),是需要先初始化系统,初始化uCOS-II需要调用函数OSInit()。 调用函数OSInit()的作用是什么?主要实现以下几个功能: 1、建立空闲任务及统计任务。 2、初始化ucos II变量及数据结构。其中包括信号量,邮箱,消息队列等初始化等。 多任

我的博客 2451
上一篇: 启动ucosii之八OSStatInit()
下一篇: 启动ucosii之九OSTimeDlyHMSM(hours,minutes,seconds,milli)
IvyOnion
博客等级 码龄15年 35粉丝 16原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值