启动之OS_CPU_C

STM32F4 + UCOSIII 关于使能FPU导致HardFault的问题 最近在工作过程中 使用stm32f4 + ucosiii开发 在使用sqrt的时候 发现总会跑进hardfault 一开始以为是没有使用FPU 导致浮点运算不了 后来单独实验 在不使能FPU 的情况下 浮点也可正常运算 然后发现裸机的话可以正常运行 跑系统就不行 将问题定位到ucos端 寻找资料 是ucosiii 代码问题 现mark一下 UCOSIII版本为V3.03 主要修改3个点,红色为修改内容。 1.stm32f4的启动文件 Reset_Handler PR... 阅读详情

任务堆栈结构的初始化
在uC/OS-II中,任务是一个无限循环,任务之间也不会互相调用,但是uC/OS-II总是执行优先级最高的任务,假定当前有一个更高优先级的任务进入就绪状态,为了保证原来低优先级任务的完整性,uC/OS-II为每个任务建立了任务堆栈,就相当于函数调用时保存返回地址和参数一样,用来保存当前任务的状态,保证任务切换能和函数调用一样正确.只不过函数调用时函数堆栈的操作过程是编译器自动完成的,而任务切换时需要模拟一个和编译器类似的任务堆栈的操作过程.
OS_STK  *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
    INT16U *stk;

    opt    = opt;                           /* 'opt' is not used, prevent warning                      */

//堆栈栈顶指针
    stk    = (INT16U *)ptos;                /* Load stack pointer                                      */

//堆栈有高地址往低地址增长,故使用*stk--
//pada参数
//假定pdata会被编译器保存到堆栈中,OSTaskStkInit()就会模仿编译器的这种行为,将pdata保存到堆栈中.
    *stk-- = (INT16U)FP_SEG(pdata);         /* Simulate call to function with argument                 */
    *stk-- = (INT16U)FP_OFF(pdata);

//任务起始地址.理论上,此处应该为任务的返回地址,但在uC/OS-II中,任务函数必须为无限循环结构,不能有返回点        
    *stk-- = (INT16U)FP_SEG(task);
    *stk-- = (INT16U)FP_OFF(task);

/*
PC:是你退出的当时执行程序时program counter,相当于你放下手中的事A去进行另一庄事情B,你得记住之前A事情已经做到什么阶段了,也许B事情你得花上1年2年

PSW:是program status word.同样道理,你开始做B事情的时候必须记住A事情的大致情况status.

堆栈:stack memory就像是一本旧的笔记本,记下A事情的各种问题,以便以后再做A事情,如果又有一个C事情,那B事情也得记到stack memory中

psw指程序状态字(program status word的缩写),是用来控制指令执行顺序并且保留和指示与程序相关的系统状态.
一般说来,程序状态字包含程序基本状态、中断码、中断屏蔽位三部分内容.

基本状态包括:指令地址,条件码,目态管态,等待计算

中断码:保存程序执行时当前发生的中断事件,以便操作系统进行分析处理

中断屏蔽位:用来指出不要响应出现的中断事件,若设置了中断屏蔽位,则即使出现了中断事件也不中止程序的执行,就像没有发生中断事件一样

*/
//中断使能-PSW状态字-0000 0010 0000 0010即
//堆栈中的SW初始化为0x0202,这将使任务启动后允许中断发生;如果设为0x0002,则任务启动后将禁止中断
    *stk-- = (INT16U)0x0202;                /* SW = Interrupts enabled                                 */

//堆栈顶端放置指向任务代码的指针
    *stk-- = (INT16U)FP_SEG(task);          /* Put pointer to task on top of stack                   */
    *stk-- = (INT16U)FP_OFF(task);


//注意寄存器在堆栈中的位置要和运行指令PUSHA,PUSH ES,和PUSH DS和压入堆栈的次序相同
//AX,BX,CX,DX,SP,BP,SI,和DI的次序是和指令PUSHA的压栈次序相同的.如果使用没有PUSHA指令的8086处理器,就要使用多个PUSH指令压入上述寄存器,且顺序要与PUSHA相同
//AX……的值在任务运行前无所谓的,因为在任务运行后在这些寄存器会有新的需要的值,写0xAAAA……是为了堆栈的这个位置是AX……,其实用其他的值也行
    *stk-- = (INT16U)0xAAAA;                /* AX = 0xAAAA                                             */
    *stk-- = (INT16U)0xCCCC;               /* CX = 0xCCCC                                            */
    *stk-- = (INT16U)0xDDDD;               /* DX = 0xDDDD                                            */
    *stk-- = (INT16U)0xBBBB;                /* BX = 0xBBBB                                             */
    *stk-- = (INT16U)0x0000;                 /* SP = 0x0000                                               */
    *stk-- = (INT16U)0x1111;                 /* BP = 0x1111                                               */
    *stk-- = (INT16U)0x2222;                 /* SI = 0x2222                                                */
    *stk-- = (INT16U)0x3333;                 /* DI = 0x3333                                                */
    *stk-- = (INT16U)0x4444;                 /* ES = 0x4444                                               */
    *stk   = _DS;                           /* DS = Current value of DS                                     */
    return ((OS_STK *)stk);
}

奋斗
//浮点仿真任务栈初始化函数 OSTaskStkInit_FPE_x86(),其中将分段寻址的地址转换为线性地址
void  OSTaskStkInit_FPE_x86 (OS_STK **pptos, OS_STK **ppbos, INT32U *psize)
{
    INT32U   lin_tos;                                 /* 'Linear' version of top-of-stack    address   */
    INT32U   lin_bos;                                 /* 'Linear' version of bottom-of-stack address   */
    INT16U   seg;
    INT16U   off;
    INT32U   bytes;


    seg      = FP_SEG(*pptos);                        /* Decompose top-of-stack pointer into seg:off   */
    off      = FP_OFF(*pptos);
    lin_tos  = ((INT32U)seg << 4) + (INT32U)off;      /* Convert seg:off to linear address             */
    bytes    = *psize * sizeof(OS_STK);               /* Determine how many bytes for the stack        */
    lin_bos  = (lin_tos - bytes + 15) & 0xFFFFFFF0L;  /* Ensure paragraph alignment for BOS            */
   
    seg      = (INT16U)(lin_bos >> 4);                /* Get new 'normalized' segment                  */
    *ppbos   = (OS_STK *)MK_FP(seg, 0x0000);          /* Create 'normalized' BOS pointer               */
    memcpy(*ppbos, MK_FP(_SS, 0), 384);               /* Copy FP emulation memory to task's stack      */
    bytes    = bytes - 16;                            /* Loose 16 bytes because of alignment           */
    *pptos   = (OS_STK *)MK_FP(seg, (INT16U)bytes);   /* Determine new top-of-stack                    */
    *ppbos   = (OS_STK *)MK_FP(seg, 384);             /* Determine new bottom-of-stack                 */
    bytes    = bytes - 384;
    *psize   = bytes / sizeof(OS_STK);                /* Determine new stack size                      */
}

LPC11C14__uCOS-II V2.91 移植笔记(三) OS_CPU_A.ASM这个文件是移植UCOS-II到LPC1114最关键的部分,里面用到一些汇编指令,Cortex-M3和Cortex-M0的任务切换都用到PenSV中断,被来向在OSStartHighRdy也安装Cortex-M3的方式来完成,就是也触发PenSV中断来完成第一个任务的执行,发现这两个内核还有有点不一样的,只要我设置NVIC_SYSPRI14为最低优先级,就不能触发SysTic 阅读详情

相关推荐

在Tricore上移植μC/OS-III——5.4 系统启动流程

本文来介绍一下多核系统的启动流程,如下面的流程图所示: /**************************************************************/ ① 系统中区分出一个主CPU,其它都是副CPU,上电后主CPU先启动,外设和全局变量的初始化全由主CPU独自完成; ② 之后主CPU启动各个副CPU,并独自完成初始化OS; ③ 副CPU先进行自身初始化(堆栈等),然后等待主CPU初始化OS完成; ④ OS初始化完成后,主CPU启动所有CPU的任务创建; ⑤ 所有CPU各

weixin_42967006的博客 822

uCOSii任务管理

主要用来测试uCOSii“创建任务,挂起任务,恢复任务,发送删除任务请求,删除任务”。

weixin_42550185的博客 2337

µC/OS-II---两个系统任务

【代码】µC/OS-II---两个系统任务。

weixin_45880844的博客 738

OS_CPU_C.C

µC/OS-Ⅱ的移植实例要求用户编写六个简单的C函数: OSTaskStkInit() OSTaskCreateHook() OSTaskDelHook() OSTaskSwHook() OSTaskStatHook() OSTimeTickHook() 唯一必要的函数是OSTaskStkInit(),其它五个函数必须得声明但没必要包含代码。OSTaskStkInt()

FunkyFrog821951259的博客 1095

μC/OS-III中CPU利用率与任务栈深度统计原理

CPU利用率和任务栈深度是嵌入式实时系统性能分析的两大基础指标。前者反映处理器时间分配效率,本质是空闲任务驱动的时序占比计算;后者表征内存安全边界,依赖哨兵值填充与运行时扫描实现精准实测。二者均不依赖硬件性能计数器,具备跨平台一致性,但对初始化时序、任务创建顺序及编译配置高度敏感。在STM32等ARM Cortex-M平台的RTOS工程中,正确启用OSStatTaskCPUUsageInit()与OSTaskStkChk(),可支撑负载评估、内存优化与故障诊断等关键实践,广泛应用于工业控制、物联网终端等对稳

weixin_35516273的博客 40

(学习日记)2024.03.18:UCOSIII第二十节:移植到STM32

三十四、移植到STM32 1、在工程中添加文件分组 2、添加文件到对应分组 3、添加头文件路径到工程中 4、具体的工程文件修改 5、修改源码中的bsp.c与bsp.h文件 6、按需配置最适的工程 1. os_cfg.h 2. cpu_cfg.h 3. os_cfg_app.h 7、修改app.c

一个放笔记的小书架 1386

OSTaskStkInit_FPE_x86()--浮点仿真任务栈初始化函数(分段寻址的地址转换为线性地址)

段地址:段内偏移量寻址方案 在 uC/OS-II 随书光盘中针对 80x86 (不带硬件浮点运算单元)的移植源码中,有一个浮点仿真任务栈初始化函数 OSTaskStkInit_FPE_x86(),其中将分段寻址的地址转换为线性地址时,使用了如下的代码: [code=cpp] seg = FP_SEG(*pptos); off = FP_OFF(*pptos); lin_tos = ((I

rayylee 2164

GD32F303C移植μC/OS-III实战:从工程结构到任务切换的完整指南

嵌入式实时操作系统(RTOS)通过任务调度与中断管理机制,为多任务并发提供确定性响应,是提升系统实时性和可维护性的关键。在国产化替代趋势下,Cortex-M4内核的GD32F303C凭借与STM32的引脚兼容性,成为许多产品从裸机向RTOS升级的热门选择。然而,GD32与ST的外设库、时钟树及中断细节存在差异,直接将STM32的UCOSIII工程“魔改”往往导致HardFault。本文基于实际工程,系统拆解μC/OS-III在GD32F303C上的移植全过程:从源码目录结构、启动文件与SysTick/Pen

weixin_34130389的博客 423

UCOS-II移植 配置文件os_cpu_c.c

os_cpu_c.c文件位于uC/OS-II Ports结构下面,主要是系统底层相关的C语言接口代码。 该文件有很多HOOK(钩子)函数,主要用于系统 初始化、与任务相关等,如系统初始化OSInitHookBegin()、OSInitHookEnd(); 创建任务时OSTaskCreateHook等。自己移植时很多钩子函数不需要使用或不用去实现函数体里面的代码。几个重要的钩子函数功能在

li_qcxy的专栏 1260

4.7W防削顶单声道D类音频功率放大器HT6872介绍

HT6872是一款低EMI,防削顶失真,单声道免滤波D类音频功率放大器。在6.5V电源,10%THD+N,4Ω负载条件下,输出4.71W功率,在各类音频终端应用中维持高效率并提供AB类放大器的性能。

weichen_78的博客 4699

避坑指南:STM32H7不同DMA控制器(MDMA/DMA2D/BDMA)到底该用哪个?

本文深入解析STM32H7系列芯片的DMA控制器选型策略,涵盖MDMA、DMA2D、BDMA等不同控制器的架构原理与性能对比。通过实际项目案例,提供高速TCM数据搬运、GUI加速、低功耗传输等场景的选型决策树,并分享性能优化与调试技巧,帮助工程师避开常见陷阱,提升系统效率。

weixin_26876073的博客 447

os_cpu_c.c

定位到源码的uCOS-II/Ports/ARM-Cortex-M3/Generic/IAR/os_cpu_c.c:os_cpu_c.c定义了9个钩子(Hook)函数和一个堆栈初始化函数。所谓钩子函数,是那些插入到某些函数中以扩展这些功能的函数,一般钩子函数是为第三方软件开发人员提供的扩充软件功能的入口。为了系统使用者扩展系统功能,uCOS-II中提供很多的钩子函数,使用者可以不修改uCOS-II的源

echo_bright_的博客 2258

A股历史数据免费下载终极指南:4000+个股数据一键打包获取

本文提供了获取A股历史数据的完整免费方案,重点介绍了Tushare Pro、AkShare等开源金融数据API的使用方法。通过详细的Python脚本示例,指导读者如何自动化批量抓取、清洗、存储4000多只个股的历史行情数据,并分享数据质量校验与性能优化技巧,助力量化研究与市场分析。

ooo22的博客 2235

c/os-II操作系统关于空闲任务

c/os-II操作系统关于空闲任务是这样描述的: 1、系统任务并且不能被删除; 2、优先级别最低而且永远就绪。 为什么必须要使用这个任务呢?我个人认为可以从两个方面回答: 第一个方面:从CPU本身的运行来看,没有任务就绪并不代表CPU要停止运行,这是总要让CPU做点什么,使CPU能正常的完成任务调度的所需要的一切动作,顺便统计一下CPU的使用率 第二个方面:从UC/OS-II的某些规则来看,空闲任...

a675938513的博客 1672

OBD诊断协议:OBDⅡ (SAE J1979) 和 OBDonUDS (SAE J1979-2) 和ZEV OBD技术架构的详细对比

摘要:文章对比了2025年最新OBD技术标准(SAEJ1979系列)的三大架构:传统OBD-II(已淘汰)、OBDonUDS(燃油/混动车)和ZEVOBD(新能源车)。核心发现:1)OBDonUDS与ZEVOBD共享UDS协议栈和DoIP通信标准,仅应用层数据(DID/DTC)不同;2)物理层统一为CAN+以太网,支持远程诊断和OTA;3)诊断工具需同时兼容J1979-2/3数据库。技术演进呈现"协议统一化、数据专用化"趋势,2027年后所有新车将强制采用新标准。

m0_56482679的博客 2390

基于OpenCV C++实现工业级形状模板匹配:仿Halcon SBM算法全解析

在计算机视觉和工业自动化领域,模板匹配是一项基础且关键的技术,用于在图像中定位已知目标。其核心原理是通过计算图像区域与预设模板之间的相似度来识别目标位置。传统的基于灰度值的匹配方法对光照变化敏感,鲁棒性不足。而基于边缘梯度方向的形状匹配技术,通过计算轮廓梯度方向的一致性进行相似度度量,从根本上提升了对光照变化的鲁棒性,并支持目标的旋转与缩放,技术价值显著。这项技术广泛应用于工业视觉检测、机器人引导、PCB定位等对精度和稳定性要求极高的场景。本文聚焦于使用开源OpenCV库,从底层仿照Halcon的Shape

weixin_33691817的博客 500

MedGemma 1.5部署教程:国产化信创环境(麒麟OS+海光CPU)适配可行性验证

本文介绍了如何在星图GPU平台自动化部署MedGemma 1.5医疗助手镜像,实现本地医疗AI问答功能。该平台支持快速部署这一专业医学模型,可应用于医疗咨询、病理分析等场景,为医疗机构提供安全可靠的智能辅助服务。

weixin_35671843的博客 692

YOLOv11的物理信息神经网络(PINN):引入物理规律约束目标运动预测

本文介绍了YOLOv11目标检测与PINN物理信息神经网络的融合技术。YOLOv11采用增强特征提取和参数优化架构,在保持实时性的同时提升检测精度。PINN通过将物理方程嵌入损失函数,实现数据高效学习。两者的结合可显著提升运动预测准确性和遮挡处理鲁棒性。文章详细阐述了环境配置、YOLOv11模型验证方法,并提供了基础PINN框架代码实现,展示了物理约束如何通过自动微分整合到神经网络中。该融合技术适用于自动驾驶、无人机导航等需要物理规律建模的视觉感知场景。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 423

UCOSII_STM32F1移植详细过程(三)

关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm、os_cpu_c.c和os_cpu.h文件底层端口代码来讲述。对于UCOS的移植,os_cpu_a.asm文件主要就是修改OS_CPU_PendSVHandler的名称,包含申明时的名称和定义源代码时的名称,其他源代码保持不变。上面部分是外部(其他源文件)定义的变量和函数,下面部分是申明本文件定义的函数,下面我会对这定义的源代码进行讲述。

weixin_63553972的博客 1238

S7-1500——(一)西门子PLC编程算法及程序设计1、拆解基本算法(一)

顺序队列也是一种操作受限的线性表,在一端添加数据,另一端取出数据,符合先进先出的特性工作过程:需要两个指针来指向存取元素的位置(头指针,尾指针)如下图头指针指向队列里边第一个元素位置(即下次出队元素所在的位置)尾指针是指向队列内最后一个元素的下一个位置(即下次要入队的元素要存放的位置)空队状态:最初始状态,队列没有任何元素,头指针和尾指针都指向队头,(由于没有任何元素,不能做出队操作,可进行入队操作)入队操作出队操作满队:一直入队,最终元素装满队列;满队后,虽然队列前面还有空间,但由于。

大小曲奇的博客 1605

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SiameseUniNLU部署教程:国产化信创环境(麒麟OS+海光CPU)适配验证报告

本文介绍了如何在星图GPU平台上自动化部署nlp_structbert_siamese-uninlu_chinese-base特征提取模型(二次构建)镜像,支持国产化信创环境。该镜像可高效执行中文文本的命名实体识别、情感分析与语义匹配等多任务NLP处理,典型应用于智能客服意图理解与政务文本结构化抽取。

weixin_36012152的博客 689

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

附录:全栈体系图(硬件 → 架构 → OS → 应用)

本文系统梳理了MCU到应用软件的全栈架构体系,通过8个核心图表展示了从硬件底层到操作系统再到应用层的完整技术路线。主要内容包括:1)分层架构图(硬件电路→外设→总线→CPU→中断→OS→应用);2)系统启动流程(上电→BootROM→main→OS);3)任务切换机制;4)RTOS/OSEK/AUTOSAR对比;5)内存映射I/O体系;6)CPU架构与OS能力映射;7)工具链流程;8)终极全栈模型图。这些图表共同构成了嵌入式系统开发的核心知识框架。

weixin_53066395的博客 487

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

告别卡顿!Atlas-OS:15分钟让你的Windows系统性能飙升30%的终极优化指南

还在为Windows系统卡顿、隐私泄露和臃肿不堪而烦恼吗?Atlas-OS作为一款开源透明的Windows优化工具,通过科学合理的性能调校、隐私保护和易用性增强,让你的电脑重获新生!这个轻量级Windows修改项目专为追求极致性能和隐私保护的用户设计,无需重装系统,只需15分钟就能让系统运行速度提升30%以上。 ## 🚀 为什么你需要Atlas-OS? ### 系统性能大幅提升 你是否经常遇

gitblog_01093的博客 849

几行汇编几行C:实现一个最简单的内核

你好,我是程序员贵哥。我们知道,在学习许多编程语言一开始的时候,都有一段用其语言编写的经典程序——Hello World。这不过是某一操作系统平台之上的应用程序,却心高气傲地问候世界。而我们学习操作系统的时候,那么也不妨撇开其它现有的操作系统,基于硬件,写一个最小的操作系统——Hello OS,先练练手、热热身,直观感受一下。本节课的配套代码,你可以从下载。请注意,这节课主要是演示思路,不要求你马上动手实现。详细的环境安装、配置我们到第十节课再详细展开。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值