STM32 eCos 启动代码分析(二)上下文切换

(失败)尝试将eCOS移植到stm32h743vi上 目录背景过程感受 背景 我的学长在一家有名的AI公司上班,他们希望能将OpenCV移植到一款低成本的CPU上,但他们对于硬件完全不懂,于是学长希望我尝试一下(虽然我那时也还不懂操作系统和CPU间的关系)。选择stm32h743vi这个型号的单片机首先当然是因为他与arm contex-a内核的CPU相比很便宜啦,其次他有DMA2D控制器,说是“专用于图像处理的专业 DMA”,然后片上ROM和RAM都还比较大,就选它了。后来看手册的时候,才发现这个所谓的DMA2D仅仅只能实现对图像的像素点进行修改值操作,并没 阅读详情

最近一直忙于工作,现在空一点继续写这个议题。(本文原创转载请注明出处 http://blog.youkuaiyun.com/rickleaf)

stm32既然属于cortexm3体系结构,那么它的线程上下文切换必然要采用cortexm3的方式

打开

packages\hal\cortexm\arch\current\src\context.S

//==========================================================================
// Context switch
//
// R0 contains a pointer to the SP of the thread to load, R1 contains
// a pointer to the SP of the current thread.        
        
        .globl  hal_thread_switch_context
        .thumb
        .thumb_func
        .type   hal_thread_switch_context, %function
hal_thread_switch_context:

        push    {r0-r12,lr}             // Push all savable register
        mov     r2,#2                   // Set state type == thread
        mrs     r3,basepri              // Get priority base register
        mov     r4,sp                   // Get SP (for info only)
        push    {r2-r4}                 // Push them
        
        str     sp,[r1]                 // Save SP

        // Fall through
        
//--------------------------------------------------------------------------
// Load context
//
// This is used to load a thread context, abandoning the current one. This
// function is also the second half of hal_thread_switch_context.

        .globl  hal_thread_load_context
        .thumb
        .thumb_func
        .type   hal_thread_load_context, %function
hal_thread_load_context:

        ldr     sp,[r0]                 // Load SP
        pop     {r2-r4}                 // Pop type, basepri and SP (discarded)
        msr     basepri,r3              // Set BASEPRI
        pop     {r0-r12,pc}             // Pop all register and return

//==========================================================================  

我们可以看到与ARM9的上下文切换相比,cortexm体系机构更为简洁。

在eCos的cortexm移植中:

R2保存当前任务的状态,比如R2=2来表示由thread进入上下文切换。

R3表示线程优先级

R4表示栈的状态

然后我们再浏览一下ARM9的上下文切换函数

packages\hal\arm\arch\current\src\context.S

// ----------------------------------------------------------------------------
//  hal_thread_switch_context
//  Switch thread contexts
//  R0 = address of sp of next thread to execute
//  R1 = address of sp save location of current thread

// Need to save/restore R4..R12, R13 (sp), R14 (lr)

// Note: this is a little wasteful since r0..r3 don't need to be saved.
// They are saved here though so that the information can match the
// HAL_SavedRegisters
        
FUNC_START_ARM(hal_thread_switch_context, r2)
        mov     ip,sp
        sub     sp,sp,#(ARMREG_SIZE - armreg_lr - 4) // skip svc_sp, svc_lr, vector, cpsr, and pc
        stmfd   sp!,{ip,lr}
        stmfd   sp!,{r0-r10,fp,ip}
        mrs     r2,cpsr
        str     r2,[sp,#armreg_cpsr]
        str     sp,[r1]                 // return new stack pointer
#ifdef __thumb__
        b       hal_thread_load_context_ARM // skip mode switch stuff
#endif

        # Now load the destination thread by dropping through
        # to hal_thread_load_context
        
// ----------------------------------------------------------------------------
//  hal_thread_load_context
//  Load thread context
//  R0 = address of sp of next thread to execute
//  Note that this function is also the second half of
//  hal_thread_switch_context and is simply dropped into from it.
        
FUNC_START_ARM(hal_thread_load_context, r2)
        ldr     fp,[r0]                 // get context to restore
        mrs     r0,cpsr                 // disable IRQ's
        orr     r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE
        msr     cpsr,r0
        ldr     r0,[fp,#armreg_cpsr]
        msr     spsr,r0
        ldmfd   fp,{r0-r10,fp,ip,sp,lr}
#ifdef __thumb__
        mrs     r1,spsr                 // r1 is scratch 
                                        // [r0 holds initial thread arg]
        msr     cpsr,r1                 // hopefully no mode switch here!
        bx      lr
#else
        movs    pc,lr                   // also restores saved PSR
#endif

 

ARM9中如果要保存连续的寄存器不能像cortexm这样才有push和pop,需要使用下面的两条指令完整类似的功能。

stmfd

ldmfd 

简单的理解一下底层的上下文保存方法更让我们方便理解两个不同体系结构是如何与操作系统接口的。

笔者将在后面的文章中通过介绍eCos的ticker继续深入的了解cortexm体系结构如何使用eCos

STM32开发中五大嵌入式操作系统对比与选型指南 嵌入式操作系统是资源受限设备开发的核心技术,通过任务调度、内存管理和通信机制实现高效系统控制。其工作原理基于实时内核设计,在STM32等微控制器上需要平衡内核体积、实时响应和功能完整性三大维度。这类系统在工业控制、物联网网关等场景具有关键价值,能显著提升开发效率和可靠性。针对STM32平台,主流的μClinux、μC/OS-II、eCos、FreeRTOS和RT-Thread各具特色:μClinux适合网络应用但内存需求大,μC/OS-II以实时性见长,FreeRTOS生态丰富,RT-Thread则内置完整 阅读详情

相关推荐

剖析适合STM32的五种嵌入式操作系统的优缺点

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux...

chao961015的博客 4437

使用STM32编写一个简单的RTOS:1.调度(一、上下文)

文章目录Cortex M3相关寄存器介绍寄存器组异常异常类型堆栈测试 实验平台:stm32f10x(cortex-m3)开发板,RTT3.0 资料来源:RTT官网文档及cortex-M3权威指南 关键字:分析RT-Thread源码、stm32、RTOS。 Cortex M3相关寄存器介绍 因为我要边学习RTT,边模仿RTT写一个简单的RTOS,所以需要先写调度、上下位切换部分。 关于调度的定义和作...

Nuko的博客 3940

手把手教你用ISP模式通过串口给STM32下载程序(附常见问题排查)

本文详细解析了STM32的ISP(在系统编程)模式,手把手教你如何通过串口给芯片下载程序,并深入探讨了SRAM启动模式用于快速调试。文章涵盖了硬件连接、软件配置、自动化脚本编写以及常见问题排查,旨在帮助开发者高效、灵活地完成程序烧录与调试工作。

h6j7k8l9p0的博客 568

五大嵌入式操作系统

[掌握这五大嵌入式操作系统,你就是STM32牛人 技术往往更新得非常快,并且总是让我们觉得学起来有难度而且有些迷茫。不过没有关系我们发烧友专注于在快乐中学习,要学习STM32,我们首先了解下五大嵌入式操作系统:μClinux、μC/OS-II、eCos、FreeRTOS和RT-thread。 TOP1:μClinux μClinux是一种优秀的嵌入式Linux版本,从字面意思看...

hbl_hz的博客 4766

析五大适合stm32的嵌入式操作系统

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux...

weixin_42832780的博客 407

ecos+stm32f207+lcd320x240移植

ecos+stm32f207+lcd320x240移植

eCos的进程调度和管理

eCos 支持两种进程调度方式, 一种是bitmap scheduler, 另外一种叫multi-queue scheduler.先说第一种, 所谓bitmap scheduler -- 为什么叫这个? 我也不知道.就是说每个优先级只能有一个任务, 优点和缺点都很明显, 优点就是scheduler很简单而且高效, 其实简单就意味着高效了 -- 我认为; 所以顺便表达一个观点 -- 如果你是

guo_guo_guo的专栏 4096

UE5新手必看:如何用蓝图系统快速打造赛车游戏(含Chaos Physics配置)

本文为UE5新手提供使用蓝图系统快速打造赛车游戏的完整指南,涵盖Chaos Physics配置、载具蓝图架构设计、控制逻辑实现等关键步骤。通过详细的实战案例和优化技巧,帮助开发者高效构建具备专业物理反馈的赛车游戏原型。

weixin_29001327的博客 387

STM32移植ECOS(转载)

转载至:http://bbs.21ic.com/icview-520412-1-1.html 经过一段时间折腾,让redboot和eCos在stm32上跑起来了,这也算是第一段的目标。仅管还有这样那样的问题,也有一些自己尚未弄懂的问题,但初步达到了自己想要的结果。 在每个移植步骤中,我都把它详细记录成文章发表在我的个人独立域名博客中。由于内容过多,所以在这里我以链接的形式呈现给

davidlinux的专栏 1585

Halcon一维测量实战:从measure_pos与measure_pairs的底层原理到精准应用

本文深入解析Halcon中measure_pos与measure_pairs算子的底层原理与精准应用,涵盖参数调优、测量矩形方向设置及典型工业场景实战。通过对比分析,揭示两者在一维测量中的核心差异与适用场景,提供从基础到高级的完整解决方案,助力工业视觉检测精度提升。

weixin_42525551的博客 423

机械臂开发必备:KDL库正逆解与动力学实战指南

在机器人算法领域,运动学与动力学计算是机械臂控制、仿真与轨迹规划的核心基础。正运动学描述关节空间到笛卡尔空间的映射,逆运动学则需要求解复杂的非线性方程,工程实现时常面临数值稳定性与调试效率的挑战。KDL(Kinematics and Dynamics Library)作为ROS生态中广泛使用的开源库,提供了统一的模型描述与高效求解器,将正逆解、雅可比矩阵及动力学参数计算封装为简洁接口,大幅降低开发门槛。无论是机械臂的笛卡尔空间轨迹跟踪,还是基于动力学模型的前馈控制,KDL都展现出强大的工程价值。本文从运动学

weixin_33860528的博客 2506

STM32 eCos 启动代码分析(一)系统复位

概述 最近接触了STM32,开始了解CortexM3系列ARM处理器上RTOS的移植和启动。 开始总是艰难的,CortexM3是arm7tdmi的升级产品,但实际上和之前的ARM7有着很大的区别。 首先,我们必须有支持CortexM3的编译器,因为CortexM3采用的是T

嵌入式虚拟系统实验室 6953

【人工智能】Cursor模型被封?两步教你破解

Cursor模型全线被禁,主流模型如Claude、GPT-4无法访问,仅剩Deepseek等基础模型可用。官方证实限制源于上游API区域政策,提供三种"无效"解决方案引发用户不满。社区发现有效解决方式:需同时开启全局代理和将Cursor网络设置改为HTTP/1.1协议,详细步骤包括修改用户设置和完全重启程序。另有SOCKS5代理配置方案供高级用户选择。技术原理推测HTTP/1.1可绕过区域检测。用户面临继续使用或转投其他工具的选择,社区交流受限但仍有讨论。

奶爸的编程之路,也就一周冷个三天 2191

STM32 eCos 启动代码分析(三)系统时钟滴答

时钟滴答好比人的心脏一样,是操作系统必不可少的一个部件,在线程的切换和软件延时等系统时间相关功能中起着无法替代的角色。 操作系统中的时钟滴答,需要一个周期性的可配置的信号源来实现,并且一般都是以中断的方式在后台通知系统下一个滴答的到来。 (本文原创,转载请注明出处http://blog.youkuaiyun.com/rickleaf) eCos中为了提供移植性,一般会用CYGNUM_HAL_INTERR

嵌入式虚拟系统实验室 5340

11、AUTOSAR配置全解析:从运行实体到通信接口

本博客详细解析了在Simulink中使用AUTOSAR字典配置AUTOSAR运行实体(Runnables)、运行实体间变量(IRVs)、参数以及多种通信接口的过程。内容涵盖运行实体及其事件的配置、IRV和参数的属性设置,以及发送-接收接口、模式切换接口、客户端-服务器接口、非易失性数据接口、参数接口和触发接口的详细配置方法。通过这些步骤,开发者可以高效地构建符合AUTOSAR标准的汽车电子软件系统。

e3f4g5的博客 123

从零到一使用PXE实现系统的无人值守自动化安装的保姆级教程

本文是《从零到一使用PXE实现系统的无人值守自动化安装的保姆级教程》亲自实操可用,本文从PXE是什么?有啥用?及其亲自实践出通过以国产银河麒麟系统为例从零到一的搭建出PXE服务器端(适用于其他系统),且测试了该搭建的PXE服务端自动化无人值守安装系统的保姆级实操教程。适用于大批量设备系统安装部署场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 580

windows下如何通过jlink调试eCos

接续上一篇关于cygwin下用串口连接redboot调试eCos的方法,这里介绍一下如何用jlink gdb server调试ecos。 (本文原创,转载请注明出处http://blog.youkuaiyun.com/rickleaf) 1、首先我们需要稍微浏览一下jlink的gdb server的英文手册 通过上图,我们可以看到J-Link的GDB server是兼容标准的GDB Server的,

嵌入式虚拟系统实验室 4681

数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟

本文介绍了连续图像和数字图像直方图匹配(直方图规定化)的原理、处理过程,并提供了案例进行了讲解。可以看到,直方图均衡处理是直方图匹配的一个重要桥梁。 最后,对于直方图规定化这个翻译个人觉得很low,个人感觉叫指定直方图更好理解,但Histogram Specification怎么翻译确实不太好把握,因此还是叫Histogram Matching直方图匹配最好。

老猿Python 2880

STM32开发实战:五大RTOS选型指南与场景解析

本文针对STM32开发中的RTOS选型难题,从资源约束、实时性要求、开发生态和外设支持四大维度,深度解析FreeRTOS、μC/OS、RT-Thread、eCos和uClinux五大嵌入式操作系统的核心特性与适用场景,为开发者提供实战选型指南。

ii567的博客 745

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

一、本文介绍 本文记录的是基于MobileNet V4的YOLOv11目标检测轻量化改进方法研究。MobileNet V4通过整合UIB、Mobile MQA以及优化的NAS策略,能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中MNv4-Conv-S、MNv4-Conv-M、MNv4-Conv-L、MNv4-Hybrid-M和MNv4-Hybrid-L五种模型,以满足不同的需求。 模型 参数量 计算量 推理速度 YOLOv11m 20.0M 67.6GFLOPs 3.5ms

Limiiiing的博客 4456

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

stm32中用到的实时系统_适合嵌入式stm32的五大操作系统解析

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的...

weixin_28978471的博客 1405

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

windows下如何通过gdb连接redboot调试eCos

eCos是gnu的产物,无论采用eclipse开发环境或者其他商业的开发环境如果要单步调试eCos的代码, 都需要通过gdb,这些ide无非是把gdb做了一次包装或者是提供了图形化的gdb命令执行方式。 既然gdb盛行于linux,如果在Windows下想应用gdb必须有linux的仿真环境。或者是Cygwin或者是MingW。 (本文原创转载请注明出处http://blog.csdn.ne

嵌入式虚拟系统实验室 4943

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

arm跑操作系统的意义_stm32跑的五种嵌入式操作系统的特点及不足

STM32系列32位微控制器,基于ARM Cortex-M3处理器。它能支持32位广泛的应用,支持包括高性能、实时功能、数字信号处理,和低功耗、低电压操作,同时拥有一个完全集成和易用的开发。本文引用地址:http://www.eepw.com.cn/article/201811/394644.htm基于STM平台且满足实时控制要求的操作系统,有以下4种可供选择。分别为μC/OS-II、μClinu...

weixin_36138385的博客 1480

五大适合STM32的嵌入式操作系统

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内...

mjf110107110的博客 3万+

32M内存 跑linux内核,stm32能跑linux吗

描述Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着...

weixin_39675513的博客 267
上一篇: windows下如何通过jlink调试eCos
下一篇: STM32 eCos 启动代码分析(三)系统时钟滴答
知秋一叶
博客等级 码龄19年 196粉丝 68原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值