滴答定时器SysTick和os_cpu_a.asm(UCOS的移植)

news2024/11/26 17:52:28

一、滴答定时器SysTick

滴答定时器是一个 24 位的倒计数定时器当计到 0 时,将从 RELOAD 寄存器中自动重装载定时器初值,只要不把它在 SysTick 控制以及状态寄存器中的使能位清零,就将永久不息。SysTick 的最大使命,就是定期地产生异常请求作为系统的时基。 OS 都需要这种“滴答”来推动任务和时间的管理。
我们在移植 UCOSII 的过程中就要使用滴答定时器来作为系统时钟, 首先就是对滴答定时器的设置,主要是设置它的定时周期,我们是在 delay_init()函数中完成滴答定时器设置的,delay_init()函数代码如下。

        其 中 红 色 代 码 部 分 就 是 在 使 用 UCOSII 时 配 置 SysTick 的 代 码 , 如 果
SYSTEM_SUPPORT_OS 被定义了就说明使用了 UCOS,那么我们就需要配置 SysTick。 首先要
根据 UCOSII 中的定义的 OS_TICKS_PER_SEC 来计算出 SysTick 的装载值 reload,开启 SysTick中断,将 reload 值写进 SysTick 的 LOAD 寄存器中,最后开启 SysTick。开启 SysTick 后还要编写 SysTick 的中断服务函数 SysTick_Handler(),函数代码如下,同样也采用了条件编译。

//systick 中断服务函数,使用 OS 时用到
void SysTick_Handler(void)
{

        HAL_IncTick();//HAL库用此函数获取时间,这里一定要注意

        if(delay_osrunning == 1)//OS开始跑了,才执行正常的调度处理

        {

                OSIntEnter();//进入中断

                OSTimeTick();//调用ucos的时钟服务程序

                OSIntExit();//触发任务切换中断

        }

}

注意!!!! 滴答定时器中断服务函数 SysTick_Handler()中一定要调用 HAL_IncTick(), 因为
HAL 库使用此函数来获得系统时间(非 UCOS 系统时间)供 HAL 库中延时函数使用!!! 如果没
有调用的话 HAL 库会工作不正常。

二、os_cpu_a.asm 文件

为了方便起见, os_cpu_a.asm 文件分段来介绍。

上面代码分为两部分,上半部分使用 IMPORT 来定义,下半部分使用 EXPORT 来定义。IMPORT 定义表示这是一个外部变量的标号,不是在本程序定义的; EXPORT 定义表示这些函数是在本文件中定义的,供其它文件调用。

 EQU 和 C 语言中的#define 一样, 定义一个宏。 NVIC_INT_CTRL 为中断控制寄存器,地址为 0xE000ED04; NVIC_SYSPRI14 为 PendSV 中断优先级寄存器,地址为 0xE000ED22;
NVIC_PENDSV_PRI 为 PendSV 和 Systick 的中断优先级,这里为 0xFFFF, 都为最低优先级;

 OS_CPU_FP_Reg_Push 和 OS_CPU_FP_Reg_Pop 是对 FPU 寄存器进行入栈和出栈操作的,对于带有 FPU 的 MCU 来说非常重要!

OS_CPU_SR_Save 和 OS_CPU_SR_Restore 是开关中断的汇编代码, 通过给 PRIMASK 写 1
来关中断,写 0 来打开中断。 这里也可是使用 CPS 指令来快速的开关中断,OS_CPU_SR_Save 中就使用了 CPSID I 来关中断。

OSStartHighRdy是由OSStart()调用,用来开启多任务的,如果多任务开启失败的话就会进入OSStartHang。

OSCtxSw 和 OSIntCtxSw 这两个是用来做任务切换的, 这两个看起来都是一样的, 其实它们都只是触发一个 PendSV 中断,具体的切换过程在 PendSV 中断服务函数里面进行。 这两个函数看起来是一样的,但是他们的意义是不同的, OSCtxSw 是任务级切换,比如从任务 A 切换到任务B, OSIntCtxSw 是中断级切换,是从中断退出时切换到一个任务中, 从中断切换到任务时,CPU 的寄存器入栈工作已经完成,无需做第二次。

 

        上面的汇编代码才是真正的任务切换程序, 在每行代码后都有详细的注释,为了更好的理解,我对代码中打标号的地方重点讲解一下。
         (1)如果 PSP 为 0 的话说明是第一次做任务切换,而任务创建的时候会调用堆栈初始化函数 OSTaskStkInit()来初始化堆栈,在初始化的过程中已经做了入栈处理,所以这里就不需要在做入栈处理,直接跳转到 PendSV_Handler_Nosave。

        (2)此时 SP 指向的就是要运行的最高优先级的任务。
        (3)因为进入中断使用的是 MSP,而退出中断的时候使用的是 PSP,因此这里需要将 LR 的位 2 置 1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows Server 2022 安全功能重大更新

这篇文将介绍 Windows Server 2022 中的一些新增的安全功能,在 Windows Server 2019 的强大基础之上引入了许多创新功能。 文章目录 一、传输:Windows Server 2022 上默认启用 HTTPS 和 TLS 1.3二、安全 DNS:通过基于 HTTPS 的 DNS 实现 DNS…

基于SpringBoot的CSGO赛事管理系统springboot20

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

功率放大器是不是越大越好用

功率放大器的大小是个相对的概念,没有绝对的“越大越好用”的说法。不同的应用场景和需求需要不同大小的功率放大器,因此选择适合的功率放大器是很重要的。 我们需要明确功率放大器的作用是对信号进行放大,使其能够驱动负载。因此&#xff0c…

c++均值滤波:cv::blur

c均值滤波:cv::blur cv::blur 是 OpenCV 中用于进行均值滤波的函数。均值滤波是一种基本的图像平滑处理方法,它用于减小图像中的噪声,平滑图像并模糊细节。 以下是 cv::blur 的一般形式: void cv::blur(cv::InputArray src, cv…

百分比组件

//组件 <template><div :class"className" :style"{ height: height, width: width }" style"overflow: hidden;" /> </template><script> export default {props: {className: {type: String,default: "chart&quo…

springboot+vue+java天气预报管理系统1439

本天气管理系统使用了开源框架SpringBoot开发实现了天气管理系统&#xff0c;并且使用了开发工具idea和数据库MySQL。在开发实现天气管理系统之前&#xff0c;需要对系统进行需求分析和调研&#xff0c;从而分析出天气管理系统需要具备什么样的功能&#xff0c;设计出对应的总体…

U盘数据防泄密软件(U盘防泄密加密软件都有哪些?)

随着科技的发展&#xff0c;U盘已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;U盘的便捷性也带来了安全隐患。为了保护您的数据安全&#xff0c;U盘防泄密加密系统应运而生。本文将从三个方面为您介绍U盘防泄密加密系统是什么、有哪些以及能做什么。 一、U盘防泄…

DataX: Ⅱ

序言 这里使用的是master分支,因为官网上并没有release分支,所以先用master分支吧,可能会有问题cuiyaonan2000163.com 参考资料: https://github.com/alibaba/DataXhttps://github.com/alibaba/DataX/blob/master/introduction.md --插件说明文档 源码打包 首先下载 Git…

二、VXLAN BGP EVPN基本原理

VXLAN BGP EVPN基本原理 1、BGP EVPN2、BGP EVPN路由2.1、Type2路由——MAC/IP路由2.2、Type3路由——Inclusive Multicast路由2.3、Type5路由——Inclusive Multicast路由 ————————————————————————————————————————————————…

static const char* 和const char*有报错,发生访问冲突

const char *srcfilere aByteArray.data(); 当重复某一操作时&#xff1a;有报错&#xff0c;发生访问冲突 const char *srcfilere aByteArray.data(); 即可解决访问冲突问题。 困扰了至少一天吧 应该是static的问题&#xff0c;吃了基础不好的亏。

CMD命令终端快捷键学习

很多环境需要安装并且指定环境变量才可用终端访问 比如一些数据库、一些环境、例如&#xff1a;nodejs Oracle、mysql 在一个文件夹按住shift鼠标右键可以快速在当前目录运行终端&#xff01;免去cd 目录的烦恼 快捷键 当你学习和使用命令终端&#xff08;如 Windows 的 CMD&…

如何让IPad Pro变成你的生产力工具?在IPad上用Vscode写代码搞开发

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. ipad pro通过软件远程vscode6.1 创建TCP隧道 7. ip…

如何用芯片ate测试设备测试芯片过压保护和过流保护?

过压保护和过流保护是指被保护的产品或电路在电压/电流超过正常运行的最大值时&#xff0c;使输入断开或内部电压/电流降低的一种保护方式。过压保护和过流保护是为了防止电路中电压/电流过大从而损坏产品&#xff0c;因此过压/过流保护电压值和电流值也是电子测试中不可或缺的…

树莓派(Linux系统通用)交叉编译(环境搭建、简单使用)

概念 交叉编译是指在一台计算机上编译运行在另一台计算机上的程序。&#xff08;编译是指&#xff0c;在一个平台上生成在该平台上的可执行程序&#xff09;通常情况下&#xff0c;编译器和目标平台的架构是不同的&#xff0c;例如&#xff0c;在一台x86平台上编译运行在ARM平…

Go 语言史诗级更新-循环Bug修复

背景 前两天 Golang 的官方博客更新了一篇文章&#xff1a;Fixing For Loops in Go 1.22 看这个标题的就是修复了 Go 循环的 bug&#xff0c;这真的是史诗级的更新&#xff1b;我身边接触到的大部分 Go 开发者都犯过这样的错误&#xff0c;包括我自己&#xff0c;所以前两年我也…

SOLIDWORKS 专业显卡要求

每次谈及SOLIDWORKS对于显卡的需求&#xff0c;都有讲不完的话题&#xff0c;往往纠结于到底选择游戏卡还是专业图形卡&#xff1f;首先需要明确&#xff0c;不仅仅是SOLIDWORKS软件, 几乎所有的图形类软件都推荐使用专业图形卡。 今天微辰三维特别整理一下SOLIDWORKS不同项目对…

实体行业数字化转型怎么做?线上线下相结合的新零售体系怎么做?

如今&#xff0c;实体行业想要取得收入增长&#xff0c;只做线下业务或者只做线上业务&#xff0c;在当前的市场环境中是难以长久生存的&#xff0c;因此一定要线上线下相结合&#xff0c;将流量运作与线下转化进行充分结合&#xff0c;才能更好地发挥实体优势&#xff0c;带来…

气球派对服务小程序商城的效果是什么

气球派对包含多种场景&#xff0c;除了线下服务如生日布置、浪漫小礼、婚礼布置、周岁礼等&#xff0c;还有相关产品销售属性&#xff1b;同时这些服务具备较高的同城场景和定制化需求&#xff0c;在实际生活中&#xff0c;这些服务的需求度较高&#xff0c;但同样需要商家不断…

防止员工拷贝公司终端电脑文件数据(如何防止企业数据文件被任意拷贝?)

在当前的信息时代&#xff0c;数据被誉为“新型石油”&#xff0c;而公司内部的文件往往是企业核心数据和竞争优势的重要载体。然而&#xff0c;近年来&#xff0c;员工私自拷贝公司内部文件的事件屡见不鲜&#xff0c;这不仅威胁到企业的信息安全&#xff0c;也可能导致公司的…