uCOS_II 移植到友善之臂mini2440

发布者:EternalBliss最新更新时间:2024-06-25 来源: elecfans关键字:uCOS_II  移植 手机看文章 扫描二维码
随时随地手机看文章
  • }  



  • 3.修改OS_CPU_A.S

    OS_CPU_A.S 主要是操作CPU寄存器的汇编代码,需要针对编译器重写。主要有如下函数

    OSCtxSw()            普通任务切换函数

    OSIntCtxSw()          中断返回时任务切换函数
    OSStartHighRdy()      OSStart()函数中启动第一个高优先级任务
    OS_CPU_IRQ_ISR()    中断处理程序
    OSTickISR()           定时器节拍中断服务程序
    OSCPUSaveSR()       关中断函数
    OSCPURestoreSR()     开中断函数
    (1)OSStartHighRdy() 
    设置cpu为SVC模式,禁止中断
    执行OSTaskSwHook
    OSRunning =TRUE
    SP = OSTCBHighRdy->OSTCBStkPtr
    出栈恢复CPU模式(其实还是SVC)
    全部出栈,从栈顶到栈低分别将数据保存到 R0-R12, LR, PC
    然后程序跳转到PC指的地址执行
    (2)OSCtxSw() :
    (首先清楚,在任务代码中C语言可能用了SP使得SP在任务切换的时候 不指向当前任务栈的栈低,因为是任务调用的OSCtxSw,所以程序返回地址保存在LR中,也就是下次切回来时要返回的地址)
    将 PC LR R12-R0 CPSR 压入任务栈
    OSTCBCur->OSTCBStkPtr = SP (以前认为这个是不需要的,因为OSTCBCur->OSTCBStkPtr就没有变过,但是SP在任务执行过后可能不指向栈低了,也就是说原来分配的栈发生了内部偏移,必须再次定位一下栈顶)
    执行OSTaskSwHook
    改变OSTCBCur  OSTCBCur = OSTCBHighRdy
    改变OSPrioCur   OSPrioCur = OSPrioHighRdy
    使SP指向新的任务栈 SP=OSTCBHighRdy->OSTCBStkPtr
    (注意 只要获得了指向TCB的指针就会找到任务栈,因为任务栈的指针保存在TCB的第一个元素中)
    LDR R0, =OSTCBHighRdy
    OSTCBHighRdy是一个指针变量,这个只是取得OSTCBHighRdy的地址保存在R0中
    LDR R0, [R0]
    取得TCB的地址
    LDR SP, [R0]
    取得TCB的第一个元素,也就是任务栈的指针
    全部出栈,从栈顶到栈低分别将数据保存到 R0-R12, LR, PC
    然后程序跳转到PC指的地址执行
    (3)OSIntCtxSw() 
    这个函数主要是中断处理程序中,中断返回所调用OSIntExit()中的任务切换函数。因为中断处理函数中已经保存了现场,所以这里就没有必要在做无用功了。只需要将SP指向下一个需要运行的任务的任务栈,恢复现场就可以了。
    执行OSTaskSwHook
    改变OSTCBCur  OSTCBCur = OSTCBHighRdy
    改变OSPrioCur   OSPrioCur = OSPrioHighRdy
    使SP指向新的任务栈 SP=OSTCBHighRdy->OSTCBStkPtr
    全部出栈,从栈顶到栈低分别将数据保存到 R0-R12, LR, PC
    然后程序跳转到PC指的地址执行
    (4)OSCPUSaveSR():
    保存CPSR到形参中(ATPCS标准规定,形参保存在R0中)
    设置CPSR相应的位 关中断
    (5)OSCPURestoreSR ()
    从R0中提取CPSR 的值,恢复以前中断的状态
    (6)OSTickISR()
    是时钟节拍中断服务函数,主要是清中断标志位,主要有两个寄存器SRCPND,INTPND。跳转到OSTimeTick()执行。
    (7)OS_CPU_IRQ_ISR()
    这个函数主要是中断处理函数,所有的IRQ 中断都需要这个函数处理。首先要理解ARM920T中断过程。大体中断过程主要分为以下几步:
    ⅰ 外部器件中断线产生中断信号,传给中断控制器。中断控制器识别是那种类型的中断,给CPU IRQ或FIQ中断线信号,同时INTOFFSET 产生中断偏移量。
    ⅱ CPU接收到中断信号后,首先自动保存PC到LR,将CPSR保存到相应模式下的SPSR,设置CPSR为相应的模式,程序跳转到逻辑地址0X00处的异常向量。(因为程序是在0X30000000处运行的,当中断发生时,并不能在0X00处找到中断向量,所以需要MMU的帮助,将0X30000000映射到0X00。这样才可以保证中断的正常响应)。
    ⅲ 在中断向量处,我们保存了HandlerIRQ的地址,所以程序到HandlerIRQ处执行。
    ⅳ 在HandlerIRQ处,使用了宏展开,目的是是程序跳转到HandleIRQ 标号处执行
    ⅴ HandleIRQ 这里是个内存缓冲池,存放着我们的中断处理程序的地址,这里是OS_CPU_IRQ_ISR,就是我们要写的中断处理程序。
    ⅵ 以上实现在2440init.s中,接下来OS_CPU_IRQ_ISR这个函数就是我们要写的。注意现在已经在IRQ模式,SP物理地址已经是IRQ模式的了(这个在2440init.s中初始化过了)。
    这里有三次模式切换。
    第1次, 由IRQ MODE 到SVC MODE 目的是保存中断现场,如果是首层中断,那么保存了任务的返回地址,以及SVC模式下中断时个寄存器的状态。如果不是首层中断那么保存了中断服务程序中的返回地址,以及IRQ模式下的各寄存器的状态。然后将OSIntNesting加1,判断是否为1,如果是1那么说明是首层中断,与特定的任务相关,OSTCBCur->OSTCBStkPtr=SP,如果不保存SP,那么在中断返回时如果被抢占,那么就切不回来了。注意不管是首层中断还是多层中断,中断现场都保存在当前任务栈中,所以如果允许中断嵌套那么保证任务栈足够大。
    第2次, 由SVC MODE 到 IRQ MODE 目的是装载中断服务程序入口地址,执行中断服务程序。
    第3次, 由IRQ MODE 到 SVC MODE 目的是执行OSIntExit,判断是否首层中断返回和是否需要任务切换。中断返回,有可能是返回上一层中断有可能是返回任务。
    (注意:中断服务执行的时候中断是禁止的,所以如果想中断嵌套那么重新打开中断即可)
    四 修改配置文件
        主要是修改OS_CFG.H,这个文件主要是配置和裁剪系统提供的功能,根据系统RAM的大小和项目的要求进行适当的裁剪,保证系统能够高效正常的运行。这里可不用修改,因为mini2440足够承受所有的功能。
    五 建立ADS工程文件,编译调试
    根据需要建立相应的 Group:uCOS_II (内核) BdInit (板级初始化) OsDir (驱动) API 然后加入相应的文件,编译,下载。测试。编译主要是排错,遇到很多问题,需要仔细分析,不要一味的钻死牛角尖。比如出现这样的错误

    在uCOS_II.H 中加入

    #ifndef   UCOS_II_H
    #define   UCOS_II_H
         ......
    #endif
    就会消除,有时候的错误是我们用编译器还不熟悉,所以感觉无从下手。要仔细分析。还有你的文件名字是大写的但是加入到ADS后编译就会变成小写的了,还有头文件包含不区分大小写。


    [1] [2]
    关键字:uCOS_II  移植 引用地址:uCOS_II 移植到友善之臂mini2440

    上一篇:使用QEMU 建立mini2440的模拟仿真环境
    下一篇:mini2440编译2.6.39.4内核

    推荐阅读最新更新时间:2026-03-18 14:01

    友善最新版mini2440学习笔记——开发板架构和搭建开发环
    这段时间一直想学习嵌入式程序设计。于是搞了一块mini2440的开发板,按照韦东山的《嵌入式Linux应用开发完全手册》,开始了我的嵌入式学习之路。 虽然网上关于mini2440的资料有一大堆,但是真正能够用得上的却不多。特别是友善最新版的mini2440上更换了新的NOR和NAND,针对这些硬件的开发资料却非常少。 我用的是友善之臂最新版mini2440,首先介绍开发板配置: 处理器:S3C2440A SDRAM: EM63A165TS NOR: SST39VF1601 (2M) NAND: K9K8G08U0E (1G) 网卡: DM9000EP 开发环境: 华硕 R455L 64位Ub
    [单片机]
    STM32MP157 Linux系统移植开发篇12:Linux内核MIPI LCD驱动移植
    本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器
    [单片机]
    iTOP-4412开发板-Android4.4-Bluetooth移植文档
    1.1 概述 近期需要把 Bluetooth 移植到 iTOP-4412 开发平台,查阅了相关资料,经过一段时间 的研究、调试,终于成功的将蓝牙功能移植到了开发板上面,这里笔者记录移植过程及注意 事项,方便以后工作需要。 iTOP-4412 开发板的 Bletooth 模块与板卡之间的连接采用 UART 接口,Bletooth 硬件模块使用的是MTK的MT6620芯片,MTK提供了Android4.0及Android4.4driver, Porting Guid,有了这些就为我们的移植工作做了总体性的指导。 但是仅仅有 MTK 提供的文档还是远远不够的,毕竟硬件接口定义不同,kernel 版本也不同,Android层与MT
    [单片机]
    iTOP-4412开发板-Android4.4-Bluetooth<font color='red'>移植</font>文档
    移植5.4内核到迅为I.MX6ULL开发板
    本篇推文会加到后续的文档里面,另外等QT视频录制完成以后,就开始更新终结者驱动和系统移植的视频,后续的驱动移植教程和视频也全部会在本次移植的5.4内核上进行讲解和录制。大家也可以趁着端午节亲手移植感受下。 获取Linux内核源码 NXP官方提供了I.MX6ULL的Linux内核源码,我们可以使用git来获取Linux 5.4.3的内核源码(为了大家学习方便我们给大家提供了下载好的核源码,后续会保存在光盘资料的“i.MX6UL终结者光盘资料5_uboot linux源码”目录下“i.MX6ULL_Kernel_5.4.3.tar.bz2”)。 下面我们通过git下载5.4.3内核源码。输入以下命令获取源码: git clon
    [单片机]
    <font color='red'>移植</font>5.4内核到迅为I.MX6ULL开发板
    STM32F407工程移植--STM32F401,F400
    最近做的项目,遇到问题以及解决方法 1、jlink总是下载失败,PC可以识别,但是keil不识别 解决办法:将工程中的和jlink相关的文件删掉,keil魔术棒中set键,弹出框,重新选择芯片型号,还有的时候是没有上电(囧) 2、stm32f407改为stm32f401步骤 (1)改启动文件,将工程中的启动文件.s文件修改,点击魔术棒--C/C++--Define中对应修改名称(将STM32F40-41xxx改为STM32F401xxx,和启动文件名一致) (2)更改器件型号,点击魔术棒-device中修改器件型号 (3)修改stm32f4xx.h中搜索#ifdef STM32F40xx后面 #define STM32F40-41
    [单片机]
    英伟达:CUDA即将移植到RISC-V架构上
    “现在CUDA只在x86和Arm上得以部署,但还没有在RISC-V上面部署,我们正在向外界传达一个信息——我们要将CUDA也移植到RISC-V的架构上。”2025年7月17日,在“第五届RISC-V中国峰会”主论坛上,英伟达副总裁Frans Sijstermans宣布了这项消息。 据Frans Sijstermans强调,目前,正在与合作伙伴和合作伙伴硬件直接合作,进行CUDA端口的工作。一旦生态系统成熟,标准的CUDA版本将支持例如:符合RISC-V指令集的服务器平台规范和Linux操作系统。 事实上,英伟达是RISC-V的早期推进者之一,要追溯到8年之前。早在2017年,上海交通大学和英伟达便联合举办了RISC-
    [半导体设计/制造]
    英伟达:CUDA即将<font color='red'>移植</font>到RISC-V架构上
    迅为i.MX6ULL开发板移植Gdb+Gdbserver调试
    因为有很多小伙伴是从单片机转过来的,用惯了单片机使用JLINk来调试程序,换到Linux非常不习惯。确实是如此,如果能在Linux上能设置断点,单步调试,查看变量,那就再好不过了。那么接下来将教大家怎么在arm板上调试应用代码的方法。 首先,了解下基本的思路: 采用这种方式进行远程调试,目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般Linux发行版中都有一个可以运行的gdb,但我们不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台做一个简单的配置,重新编译得到相应的gdb,如armv4. 搭建环境 UBuntu版本:Ubuntu 12.04 交叉编译器:arm-200
    [单片机]
    迅为i.MX6ULL开发板<font color='red'>移植</font>Gdb+Gdbserver调试
    迅为iTOP4418开发板Qt系统移植4G-EC20
    通过配置 linux 内核驱动,在文件系统移植 ppp 拨号工具移植 EC20 到 Qt 系统和最小 linux 系统,移植中需要的软件包和文档在网盘资料“iTOP4418 开发板资料汇总(不含光盘内容)9_iTOP-4418 开发板最小 linux_Qt_ Ubuntu 扩展文档23_章节_移植 EC20”下载。 EC20 模块封装成标准的 PCIe 接口,和开发板主要通过 usb 通讯。此次提供的文件有 pppd 源码、编译好的 chat 和 pppd 工具、wcdma,wcdma_back,wcdma-chatconnect、wcdma-chat-disconnect 以及要在文档最后使用的 pppd_conf.sh 脚本,
    [单片机]
    迅为iTOP4418开发板Qt系统<font color='red'>移植</font>4G-EC20
    小广播
    最新单片机文章
    何立民专栏 单片机及嵌入式宝典

    北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

    厂商技术中心

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

     
    机器人开发圈

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved