浙江省工程建设协会网站广告制作行业

news/2025/9/28 3:32:33/文章来源:
浙江省工程建设协会网站,广告制作行业,临淄房产信息网123,做文字logo的网站写在前面#xff1a; 由于时间的不足与学习的碎片化#xff0c;写博客变得有些奢侈。 但是对于记录学习#xff08;忘了以后能快速复习#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位#xff0c;以时间为顺序#xff0c;仅仅将博客当做一个知识学习的目录 由于时间的不足与学习的碎片化写博客变得有些奢侈。 但是对于记录学习忘了以后能快速复习的渴望一天天变得强烈。 既然如此 不如以天为单位以时间为顺序仅仅将博客当做一个知识学习的目录记录笔者认为最通俗、最有帮助的资料并尽量总结几句话指明本质以便于日后搜索起来更加容易。 标题的结构如下“类型”“知识点”——“简短的解释” 部分内容由于保密协议无法上传。 点击此处进入学习日记的总目录 2024.03.03 十、UCOSIII常用汇编指令十一、UCOSIIIOS系统初始化十二、UCOSIII启动系统十三、UCOSIII任务切换1、PendSV异常2、PendSV异常服务函数 十、UCOSIII常用汇编指令 指令名称作用EQU给数字常量取一个符号名相当于C语言中的defineAREA汇编一个新的代码段或者数据段SPACE分配内存空间PRESERVE8当前文件栈需按照8字节对齐EXPORT声明一个标号具有全局属性可被外部的文件使用DCD以字为单位分配内存要求4字节对齐并要求初始化这些内存PROC定义子程序与ENDP成对使用表示子程序结束WEAK弱定义如果外部文件声明了一个标号则优先使用外部文件定义的标号如果外部文件没有定义也不出错。要注意的是这个不是ARM的指令是编译器的这里放在一起只是为了方便。IMPORT声明标号来自外部文件跟C语言中的EXTERN关键字类似B跳转到一个标号ALIGN编译器对指令或者数据的存放地址进行对齐一般需要跟一个立即数缺省表示4字节对齐。要注意的是这个不是ARM的指令是编译器的这里放在一起只是为了方便。END到达文件的末尾文件结束IF,ELSE,ENDIF汇编条件分支语句跟C语言的if else类似MRS加载特殊功能寄存器的值到通用寄存器MSR存储通用寄存器的值到特殊功能寄存器CBZ比较如果结果为0 就转移CBNZ比较如果结果非0 就转移LDR从存储器中加载字到一个寄存器中LDR[伪指令]加一个立即数或者一个地址值到一个寄存器。举例LDRLDRH从存储器中加载半字到一个寄存器中LDRB从存储器中加载字节到一个寄存器中STR把一个寄存器按字存储到存储器中STRH把一个寄存器存器的低半字存储到存储器中STRB把一个寄存器的低字节存储到存储器中LDMIA加载多个字并且在加载后自增基址寄存器STMIA存储多个字并且在存储后自增基址寄存器ORR按位或BX直接跳转到由寄存器给定的地址BL跳转到标号对应的地址并且把跳转前的下条指令地址保存到LRBLX跳转到由寄存器REG给出的的地址并根据REG的LSB切换处理器状态还要把转移前的下条指令地址保存到LR。ARM(LSB0)Thumb(LSB1)。CM3 只在Thumb中运行就必须保证reg 的LSB1否则一个fault 打过来 为了快速地开关中断 CM3 专门设置了一条 CPS 指令有 4 种用法 PRIMASK和FAULTMAST是CM3里面三个中断屏蔽寄存器中的两个还有一个是BASEPRI 有关这三个寄存器的详细用法见表 名字功能描述PRIMASK这是个只有单一比特的寄存器。在它被置1后就关掉所有可屏蔽的异常只剩下NMI和硬FAULT可以响应。它的缺省值是0表示没有关中断。FAULTMASK这是个只有1个位的寄存器。当它置1时只有NMI才能响应所有其他的异常甚至是硬FAULT也通通闭嘴。它的缺省值也是0表示没有关异常。BASEPRI这个寄存器最多有9位由表达优先级的位数决定。它定义了被屏蔽优先级的阈值。当它被设成 某个值后所有优先级号大于等于此值的中断都被关优先级号越大优先级越低。但若被设成0则不关闭任何中断0也是缺省值。 十一、UCOSIIIOS系统初始化 OS系统初始化一般是在硬件初始化完成之后来做的主要做的工作就是初始化μC/OS-III中定义的全局变量。 OSInit()函数在文件 os_core.c中定义 /* RTOS初始化 ** 初始化全局变量 */ void OSInit (OS_ERR *p_err) {OSRunning OS_STATE_OS_STOPPED;OSTCBCurPtr (OS_TCB *)0;OSTCBHighRdyPtr (OS_TCB *)0;OS_RdyListInit();*p_err OS_ERR_NONE; }OSRunning OS_STATE_OS_STOPPED; 系统用一个全局变量OSRunning来指示系统的运行状态 刚开始系统初始化的时候默认为停止状态即OS_STATE_OS_STOPPED。 OSTCBCurPtr (OS_TCB *)0; 全局变量OSTCBCurPtr是系统用于指向当前正在运行的任务的TCB指针在任务切换的时候用得到。OSTCBHighRdyPtr (OS_TCB *)0; 全局变量OSTCBHighRdyPtr用于指向就绪任务中优先级最高的任务的TCB在任务切换的时候用得到。 此处暂时不支持优先级则用于指向第一个运行的任务的TCB。OS_RdyListInit(); OS_RdyListInit()用于初始化全局变量OSRdyList[]即初始化就绪列表。 OS_RdyListInit()在os_core.c文件中定义*p_err OS_ERR_NONE; 代码运行到这里表示没有错误即OS_ERR_NONE。全局变量OSTCBCurPtr和OSTCBHighRdyPtr均在os.h中定义 十二、UCOSIII启动系统 任务创建好系统初始化完毕之后就可以开始启动系统了。系统启动函数OSStart()在os_core.c中定义 if ( OSRunning OS_STATE_OS_STOPPED ) 系统是第一次启动的话if 肯定为真则继续往下运行。 OSTCBHighRdyPtr OSRdyList[0].HeadPtr; OSTCBHIghRdyPtr 指向第一个要运行的任务的TCB。 因为暂时不支持优先级所以系统启动时先手动指定第一个要运行的任务。 OSStartHighRdy(); OSStartHighRdy()用于启动任务切换即配置PendSV的优先级为最低然后触发PendSV异常 在PendSV异常服务函数中进行任务切换。该函数不再返回在文件os_cpu_a.s中定义由汇编语言编写 LDR R0, NVIC_SYSPRI14 配置PendSV的优先级为0XFF即最低。在μC/OS-III中 上下文切换是在PendSV异常服务程序中执行的配置PendSV的优先级为最低从而消灭了在中断服务程序中执行上下文切换的可能。 MOVS R0, #0 设置PSP的值为0开始第一个任务切换。在任务中 使用的栈指针都是PSP后面如果判断出PSP为0则表示第一次任务切换。 LDR R0, NVIC_INT_CTRL 触发PendSV异常如果中断启用且有编写PendSV异常服务函数的话 则内核会响应PendSV异常去执行PendSV异常服务函数。 CPSIE I 开中断因为有些用户在main()函数开始会先关掉中断 等全部初始化完成后在启动OS的时候才开中断。 汇编常用指令作用如下 十三、UCOSIII任务切换 1、PendSV异常 当调用OSStartHighRdy()函数触发PendSV异常后就需要编写PendSV异常服务函数然后在里面进行任务切换。 PendSV异常服务函数名称必须与启动文件里面向量表中PendSV的向量名一致 如果不一致则内核是响应不了用户编写的PendSV异常服务函数的只响应启动文件里面默认的PendSV异常服务函数。 启动文件里面为每个异常都编写好默认的异常服务函数函数体都是一个死循环当你发现代码跳转到这些启动文件里面默认的异常服务函数的时候 就要检查下异常函数名称是否写错了没有跟向量表里面的一致。 PendSV异常服务中主要完成两个工作 一是保存上文即保存当前正在运行的任务的环境参数 二是切换下文 即把下一个需要运行的任务的环境参数从任务栈中加载到CPU寄存器从而实现任务的切换。 PendSV异常服务中用到了OSTCBCurPtr和OSTCBHighRdyPtr这两个全局变量这两个全局变量在os.h中定义 要想在汇编文件os_cpu_a.s中使用必须将这两个全局变量导入到os_cpu_a.s中 IMPORT OSTCBCurPtr IMPORT OSTCBHighRdyPtr 使用IMPORT关键字将os.h中的OSTCBCurPtr和OSTCBHighRdyPtr这两个全局变量导入到该汇编文件 从而该汇编文件可以使用这两个变量。如果是函数也可以使用IMPORT导入的方法。 EXPORT OSStartHighRdy EXPORT PendSV_Handler 使用EXPORT关键字导出该汇编文件里面的OSStartHighRdy和PendSV_Handler这两个函数 让外部文件可见。除了使用EXPORT导出外还要在 某个C的头文件里面声明下这两个函数在μC/OS-III中是在os_cpu.h中声明这样才可以在C文件里面调用这两个函数。 2、PendSV异常服务函数 ;******************************************************************************************************** ; PendSVHandler异常 ;******************************************************************************************************** PendSV_Handler ; 任务的保存即把CPU寄存器的值存储到任务的堆栈中 CPSID I ; 关中断NMI和HardFault除外防止上下文切换被中断 MRS R0, PSP ; 将psp的值加载到R0CBZ R0, OS_CPU_PendSVHandler_nosave ; 判断R0如果值为0则跳转到OS_CPU_PendSVHandler_nosave; 进行第一次任务切换的时候R0肯定为0;-----------------------一、保存上文----------------------------- ; 任务的切换即把下一个要运行的任务的栈内容加载到CPU寄存器中 ; 在进入PendSV异常的时候当前CPU的xPSRPC任务入口地址R14R12R3R2R1R0会自动存储到当前任务堆栈同时递减PSP的值 ;--------------------------------------------------------------STMDB R0!, {R4-R11} ; 手动存储CPU寄存器R4-R11的值到当前任务的堆栈LDR R1, OSTCBCurPtr ; 加载 OSTCBCurPtr 指针的地址到R1这里LDR属于伪指令LDR R1, [R1] ; 加载 OSTCBCurPtr 指针到R1这里LDR属于ARM指令STR R0, [R1] ; 存储R0的值到 OSTCBCurPtr-OSTCBStkPtr这个时候R0存的是任务空闲栈的栈顶;-----------------------二、切换下文----------------------------- ; 实现 OSTCBCurPtr OSTCBHighRdyPtr ; 把下一个要运行的任务的栈内容加载到CPU寄存器中 ; 任务的切换即把下一个要运行的任务的堆栈内容加载到CPU寄存器中 ;-------------------------------------------------------------- OS_CPU_PendSVHandler_nosave ; OSTCBCurPtr OSTCBHighRdyPtr;LDR R0, OSTCBCurPtr ; 加载 OSTCBCurPtr 指针的地址到R0这里LDR属于伪指令LDR R1, OSTCBHighRdyPtr ; 加载 OSTCBHighRdyPtr 指针的地址到R1这里LDR属于伪指令LDR R2, [R1] ; 加载 OSTCBHighRdyPtr 指针到R2这里LDR属于ARM指令STR R2, [R0] ; 存储 OSTCBHighRdyPtr 到 OSTCBCurPtrLDR R0, [R2] ; 加载 OSTCBHighRdyPtr 到 R0LDMIA R0!, {R4-R11} ; 加载需要手动保存的信息到CPU寄存器R4-R11MSR PSP, R0 ; 更新PSP的值这个时候PSP指向下一个要执行的任务的堆栈的栈底这个栈底已经加上刚刚手动加载到CPU寄存器R4-R11的偏移ORR LR, LR, #0x04 ; 确保异常返回使用的堆栈指针是PSP即LR寄存器的位2要为1CPSIE I ; 开中断BX LR ; 异常返回这个时候任务堆栈中的剩下内容将会自动加载到xPSRPC任务入口地址R14R12R3R2R1R0任务的形参; 同时PSP的值也将更新即指向任务堆栈的栈顶。在STM32中堆栈是由高地址向低地址生长的。NOP ; 为了汇编指令对齐不然会有警告END ; 汇编文件结束CPSID I 关中断NMI和HardFault除外防止上下文切换被中断。 在上下文切换完毕之后会重新开中断。 MRS R0, PSP 将PSP的值加载到R0寄存器。MRS是ARM 32位数据加载指令 功能是加载特殊功能寄存器的值到通用寄存器。 CBZ R0, OS_CPU_PendSVHandler_nosave 判断R0如果值为0则跳转到OS_CPU_PendSVHandler_nosave。进行第一次任务切换的时候 PSP在OSStartHighRdy初始化为0所以这个时候R0肯定为0则跳转到OS_CPU_PendSVHandler_nosave。 CBZ是ARM16位转移指令用于比较结果为0则跳转。 STMDB R0!, {R4-R11} 手动存储CPU寄存器R4-R11的值到当前任务的栈。 当异常发生进入PendSV异常服务函数的时候 当前CPU寄存器xPSRPC任务入口地址R14R12R3R2R1R0会自动存储到当前的任务栈同时递减PSP的值 这个时候当前任务的栈空间分布具体见 进入PendSV异常时当前任务的栈空间分布图。 当执行STMDB R0!, {R4-R11}代码后 当前任务的栈空间分布具体见 当前任务执行完上文保存时的栈空间分布图 STR R0, [R1] 存储R0的值到OSTCBCurPtr-OSTCBStkPtr 这个时候R0存的是任务空闲栈的栈顶。到了这里上文的保存就总算完成。 这个时候当前任务的栈空间分布和栈指针指向具体见 当前任务执行完上文保存时的栈空间分布和StkPtr指向图 OS_CPU_PendSVHandler_nosave 当第一次任务切换的时候会跳转到这里运行。当执行过一次任务切换之后 则顺序执行到这里。这个标号以后的内容属于下文切换。 LDR R0, OSTCBCurPtr 加载 OSTCBCurPtr 指针的地址到R0。在ARM汇编中操作变量都属于间接操作 即要先获取到这个变量的地址。这里LDR属于伪指令不是ARM指令。举例LDR Rd, label如果label是立即数 那Rd等于立即数如果label是一个标识符比如指针那存到Rd的就是label这个标识符的地址。 STR R2, [R0] 存储 OSTCBHighRdyPtr 到 OSTCBCurPtr 实现下一个要运行的任务的TCB存储到OSTCBCurPtr。 LDR R0, [R2] 加载 OSTCBHighRdyPtr 到 R0。TCB中第一个成员是栈指针StkPtr 所以这个时候R0等于StkPtr后续操作任务栈都是通过操作R0来实现不需要操作StkPtr。 LDMIA R0!, {R4-R11} LDMIA中的I是increase的缩写A是after的缩小 R0后面的感叹号“”表示会自动调节R0里面存的指针。 将任务栈中需要手动加载的内容加载到CPU寄存器R4-R11同时会递增R0 让R0指向空闲栈的栈顶栈空间的分布情况具体见 任务创建成功后栈空间的分布图。 当任务被创建的时候任务的栈会被初始化 初始化的流程是 先让栈指针StkPtr指向栈顶 然后从栈顶开始依次存储 异常退出时会自动加载到CPU寄存器 的值和 需要手动加载到CPU寄存器 的值 具体代码实现见OSTaskStkInit()函数。 当把需要手动加载到CPU的栈内容加载完毕之后栈空间的分布图和栈指针指向具体见图 手动加载栈内容到CPU寄存器后的栈空间分布图 注意这个时候StkPtr不变变的是R0。 MSR PSP, R0 更新PSP的值这个时候PSP与图3‑4中R0的指向一致。 ORR LR, LR, #0x04 设置LR寄存器的位2为1确保异常退出时使用的栈指针是PSP。 当异常退出后就切换到就绪任务中优先级最高的任务继续运行。 CPSIE I 开中断。上下文切换已经完成了四分之三剩下的就是异常退出时自动保存的部分。 BX LR 异常返回这个时候任务栈中的剩下内容将会自动加载到xPSRPC任务入口地址 R14R12R3R2R1R0任务的形参这些寄存器。同时PSP的值也将更新即指向任务栈的栈顶。 这样就切换到了新的任务。 这个时候栈空间的分布具体见 刚切换完成即将运行的任务的栈空间分布和栈指针指向图

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

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

相关文章

广东网站开发公司电话免费1级做爰片在线网站

原文地址:https://jaune162.blog/2024/02/15/study-website-recommend Developer Roadmaps(开发者路线图) 官网地址:https://roadmap.sh/ 该网站包含了各个方向、各个语言的开发人员从零开始学习的路线图。 下图为Java方向的学…

网站的全栈建设更改wordpress主题

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

大型餐饮网站建设济南网站建设公司推荐

目录 简单代码算出最大公约数,最小公倍数: 辗转相除法得到最大公约数: 两数相乘倒序最小公倍数: 分解质因式, 打印输出, 并且存到列表 主程序: 由质因式得到最小公倍数: 简单代码算出最大公约数,最小公倍数: # 最大公约数和最小公倍数 a int(input(please enter 1st num:)…

建设网站对比方案网页视频提取在线工具

写在前面 本文将从零开始,写第一个 skynet 程序 HelloWorld 。通过 HelloWorld 可以熟悉 skynet 的运作方式,和了解其 api 。 文章目录 写在前面准备工作编写代码运行结果 准备工作 首先要有一个编译好,而且工作正常的 skynet 。 编写代码…

wordpress 娱乐插件wordpress 标题优化

上一篇介绍的借助ORM的增、删、改和DolerGet方法,ORM可以很精准的知道热点数据做内存缓存。那么就有一个问题存在,即部署了多个站点时候,如果用户在一个Web里修改数据了,那么其他Web的ORM是不知道这个变化的,其他Web还…

盘锦公司做网站自己给公司做网站该怎么做

使用 谷歌官方工具Android GPU Inspector (AGI) 可以对Android 应用进行深入和全面的系统性能分析和帧性能分析 。AGI 是一个非常强大的分析工具,尤其是在需要诊断 GPU 性能问题和优化应用时,可以帮助你精准找到性能瓶颈。本文介绍如何使用该工具对帧数据…

阿里云申请域名做网站南京学做网站

一、什么是大模型「幻觉」 大模型的幻觉问题通常指的是模型在处理输入时可能会产生一些看似合理但实际上是错误的输出,这可能是因为模型在训练时过度拟合了训练数据,导致对噪声或特定样本的过度敏感。 "大数据幻觉"指的是在处理大规模数据时…

网站制作价格公司牡丹江林口县建设局网站

在现今的科技繁荣时代,音频技术作为人类感知世界的重要方式,已经变得越来越重要。唯创知音WT2605C-A001音频蓝牙语音芯片,以其卓越的特性和创新性,正在为音频技术领域带来一场革命。 首先,这款芯片以其极小的体积—仅…

岐金兰与AI元人文概念的深度关联研究:从理论构想到实践应用

岐金兰与AI元人文概念的深度关联研究:从理论构想到实践应用 一、引言:跨学科视野下的岐金兰与AI元人文 在人工智能技术迅猛发展的2025年,岐金兰作为一位融合诗歌创作与人工智能人文研究的跨学科创作者,提出的"…

什么是网站建设策划百度开户

https跳过SSL认证时是不是就是不加密的,相当于http?,其实不是,HTTPS跳过SSL认证并不相当于HTTP,也不意味着没有加密。请注意以下几点: HTTPS(Hypertext Transfer Protocol Secure)本质上是在HTTP的基础上…

北京互联网公司开发的网站如何搭建自己得网站

Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 用户定义类型(UDT)是Java类,其实例(对象)存储在数据库表列中。 UDT定义为…

ABC425

ABC425C. Rotate and Sum Query 如果没有第一种查询,只要直接做前缀和就行。 即使有第一种查询,也不必真的去移动元素,只要把下标整体偏移一下,记住“原序列中每个元素现在排在第几位”,就能知道想要的区间和在原…

介绍几个能进去的a站深圳网站运营

一、前言在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core Runtime、Nginx、MySQL,以及如何将我们的 ASP.NET Core MVC 程序部署到 Li…

比较好的网页设计网站wordpress 手机顶部悬浮

LabVIEW高精度微小电容测量 在电子工程和科研领域,精确测量微小电容值是一项有一定要求的任务,尤其在涉及到高精度和低成本时。设计了一种基于LabVIEW高精度微小电容测量系统,旨在提供一个既经济又高效的解决方案。 该系统的核心在于使用FD…

石狮市建设局网站普通小程序开发者工具

文章目录 基于C/C的UG二次开发流程1 环境搭建1.1 新建工程1.2 项目属性设置1.3 添加入口函数并生成dll文件1.4 执行程序1.5 ufsta入口1.5.1 创建程序部署目录结构1.5.2 创建菜单文件1.5.3 设置系统环境变量1.5.4 制作对话框1.5.5 创建代码1.5.6 部署和执行 基于C/C的UG二次开发…

成都市金堂县网站建设微信平板专用版ipad版

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类…

如何自己做淘宝客推广网站外国人的做视频网站

一、pandas介绍 1、2008年Wes McKinney(韦斯麦金尼)开发出的库 2、专门用于数据分析的开源python库 3、以numpy为基础,借力numpy模块在计算方面性能高的优势 4、基于matplotlib能够简便的画图 5、独特的数据结构 6、也是三个单词组合而…

口碑好的专业网站建设天河网站建设推广

换肤其实也属于插件化专题的一个子话题,之所以单独拿出来,是因为它的处理方式比较特殊,相比插件化而言较简单一些。 系统内置的换肤功能支持 - Theme Android 系统中如果想修改应用的背景色,最简单的就是利用以下Theme相关的属性: 使用这些内置的属性可以实现一定程度上…

做软件赚钱的网站php中网站不同模板后台逻辑代码怎么管理

文章目录前言InterceptorChain保存所有的Interceptor创建四大对象都走ConfigurationInterceptorChain增强对象方法Plugin封装动态代理,让你使用Mybatis拦截器更简单Invocation,让我们能在拦截器中使用动态代理类中的invoke方法中的对象调用时序图小结前言…

基层建设 官方网站WordPress潮流媒体主题

在/ l o g s目录中查找更改时间在7日以前的文件并删除它们: $ find logs/ -type f -mtime 7 -exec rm -f {} \; 在/ l o g s目录中查找更改时间在7日以内的文件并删除它们: $ find logs/ -type f -mtime -7 -exec rm -f {} \; 然后加入的计划任务中每日执…