学习ARM开发(21)

发布者:自在自由最新更新时间:2024-11-15 来源: cnblogs关键字:ARM开发 手机看文章 扫描二维码
随时随地手机看文章

void EIntTickIsr(void) __attribute__((naked));

void EIntTickIsr(void)

{

       //保存R0-R12寄存器到栈里.

       asm volatile(' STMDB  SP!, {R0-R12} ');

      

       //关闭TICK中断.

       INTMSK |= BIT_GLOBAL|BIT_TICK;

 

       //取得保存IRQ的LR地址,并保存LR.

       asm volatile (' LDR     R0,=g_dwIRQLR' );

       asm volatile (' SUBS    LR,LR,#4 ');

       asm volatile (' STR           LR,[R0] ');

 

       //取回前面保存的R0-R12寄存的值.

       asm volatile (' LDMIA       SP!, {R0-R12} ');

 

       //取得最后返回的SPSR,就是SVC模式下的CPSR.

       //从IRQ模式切换回到SVC模式.

       asm volatile (' MRS          LR,SPSR ');

       asm volatile (' ORR           LR,#0xc0 ');

       asm volatile (' MSR          CPSR,LR ');

 

       //现在已经转换回到SVC模式,取回IRQ模式下保存的LR.

       //把R0的值保存到栈中第二个位置.

       asm volatile (' STR     R0,[SP,#-8] ');

 

       //从保存位置取回IRQ模式下保存的LR值.

       asm volatile (' LDR     R0,=g_dwIRQLR' );

       asm volatile (' LDR     R0,[R0] ');

 

       //把IRQ模式下的LR保存到栈里,就是出栈时的PC值.

       asm volatile (' STMDB   SP!,{R0} ');

 

       //从栈里第二个位置取回先前保存的R0值.

       asm volatile (' SUBS    SP,SP,#4 ');

       asm volatile (' LDMIA   SP!,{R0} ');

 

       //保存R0-R12,LR到栈里,入栈顺序是刚好相反的.

       asm volatile (' STMDB   SP!,{R0-R12,LR} ');

 

       //保存CPSR的值到栈里,就是SPSR的位置.

       asm volatile (' MRS     R4,CPSR ');

       asm volatile (' BIC     R4,#0xc0 ');

       asm volatile (' STMDB   SP!,{R4} ');

 

       //保存栈顶到任务指针里.

       asm volatile ( 'LDR           R0, %0' : : 'm' (g_pCurrentTask) );

       asm volatile ( 'STR           SP, [R0]' );

 

       //增加时钟计数.

       g_dwTickCount++;  

       //    

       printf('g_dwTickCount = (%d)/n',g_dwTickCount);

       //    

       //清除屏蔽位.

       I_ISPC = BIT_TICK;           

       INTMSK &= ~(BIT_GLOBAL|BIT_TICK);

 

       //

       if (g_dwTickCount < 3)

       {

              g_pCurrentTask = g_pCurrentTask1;

       }

       else if (g_dwTickCount < 4)

       {

              g_pCurrentTask = g_pCurrentTask2;

       }

       else

       {

              g_dwTickCount = 0;

       }

 

       //取得新任务指针

       asm volatile ( 'LDR           R0, %0' : : 'm' (g_pCurrentTask) );  

       asm volatile ( 'LDR           SP, [R0]' );

 

       //取回SPSR值.

       asm volatile ( 'LDMIA       SP!, {R0}' );

       asm volatile ( 'MSR          SPSR, R0' );

 

       //取回R0-R12,LR,PC值,并运行最后的任务.

       asm volatile ( 'LDMIA       SP!, {R0-R12,LR,PC}^' );

}

 

写完上面的代码,就可以真正地实现了任务调度了。有了以上的代码,写其它复杂的任务调试都变得很容易了,这些代码得来是不太容易的,我经历了好几个星期的调试才通过的。

这些都是在我的S3C44B0开发板上调试通过的


[1] [2]
关键字:ARM开发 引用地址:学习ARM开发(21)

上一篇:学习ARM开发(20)
下一篇:学习ARM开发(22)

推荐阅读最新更新时间:2025-12-19 12:00

ARM开发环境KEIL和IAR设置堆的占用空间大小
大家在ARM开发过程中都会遇到堆栈不够或者堆栈设置太大的情况,下面我就通过IAR和KEIL两个开发环境,来介绍如何修改堆栈的大小 工具/原料 IAR KEIL 一、IAR 打开工程文件,在左上角工具栏选择 Project- Options... 在Category栏选中Linker 在右侧内容栏选中Config 勾选Override defaut选项 点击Edit按钮,在弹出的对话框中选中Stack/Heap Sizes,这样就可以修改CSTACK和HEAP的大小了 END 二、KEIL 打开ARM芯片的启动文件,比如startup_stm32f10x_md_vl.s文件 在文件的
[单片机]
<font color='red'>ARM</font><font color='red'>开发</font>环境KEIL和IAR设置堆<font color='red'>栈</font>的占用空间大小
STM32 HAL开发环境搭建指南:Keil MDK-ARM、STM32F1xx DFP与ST-Link工具链配置详解,结合STM32CubeMX使
安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法: 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径,避免占用C盘空间。 Core就是Keil(MDK-ARM)的程序安装目录。 Pack是各系列芯片的开发板的开发包的安装目录。 还要填写下用户信息: 然后开始安装: 同意安装“KEIL-Tools By ARM 通用串行总线控制器” 启动之后Keil会自动进行包描述的更新: 我们最好耐心等待它检查完,右下角会有进度: 大概会花费10到20分钟左右的时间 2025-03-29
[单片机]
STM32 HAL<font color='red'>开发</font>环境搭建指南:Keil MDK-<font color='red'>ARM</font>、STM32F1xx DFP与ST-Link工具链配置详解,结合STM32CubeMX使
IAR开发平台升级Arm和RISC-V开发工具链,加速现代嵌入式系统开发
瑞典乌普萨拉,2025年6月10日 — 全球领先的嵌入式软件解决方案供应商IAR正式发布其旗舰产品的重大更新版本: Arm开发工具链v9.70和RISC-V开发工具链v3.40,大幅提升了IAR开发平台在性能、安全性和自动化方面的能力,助力汽车、工业、医疗和物联网等行业中的敏捷、可扩展嵌入式应用。 为应对嵌入式系统日益增长的复杂性,全新的IAR开发工具链支持云端许可、CI/CD管道集成和多种架构的开发。随着Arm和RISC-V持续推动技术演进,IAR推出统一的开发平台,提供高质量且具安全保障的开发体验。新版本帮助客户提升研发效率、降低研发成本、缩短产品上市时间,从而使复杂的嵌入式系统开发更具可预测性和可扩展性。 IAR首席
[嵌入式]
IAR<font color='red'>开发</font>平台升级<font color='red'>Arm</font>和RISC-V<font color='red'>开发</font>工具链,加速现代嵌入式系统<font color='red'>开发</font>
Arm开发出计算子系统 以加速汽车设计的下一代AI芯片的开发
据外媒报道,半导体设计与软件平台公司Arm开发出包含16个高性能处理器的计算子系统(compute sub-system,CSS),旨在加速下一代汽车AI芯片的开发。这是Zena品牌的首次使用,提供16个Cortex A720AE汽车处理器内核和Cortex-R82AE实时微控制器内核。 图片来源: Arm 一个关键的区别在于,Mali GPU是可选的,AI加速器也是如此,这表明ARM期望芯片制造商能够添加额外的IP,无论是作为RTL还是chiplet的形式添加到芯片中。 这标志着软件定义汽车将越来越多地采用人工智能,从而推高了处理需求。“超过94%的汽车制造商使用ARM技术,排名前15的芯片供应商也使用我们的技术,
[汽车电子]
<font color='red'>Arm</font><font color='red'>开发</font>出计算子系统 以加速汽车设计的下一代AI芯片的<font color='red'>开发</font>
Arm 携手微软赋能开发者创新,共筑云计算和 PC 未来
Arm 和微软正携手共筑未来,从而使创新不受设备功耗或不同部署环境的限制。在近期举行的微软 Build 大会上,Arm 的愿景实现再次得到体现 —— 致力于确保微软的整个软件生态系统都能访问 Arm 计算平台并从中受益 。无论是在 Microsoft Azure 的云端还是在 Windows on Arm PC 的边缘侧,开发者可以在任何地方加速其应用和工作负载。 本次大会展示的亮点如下: 在基于 Arm 架构的 Microsoft Azure Cobalt 100 上部署领先的微软及第三方应用工作负载,包括 Microsoft Defender for Endpoint、Teams,以及 Adobe、Databrick
[嵌入式]
用一套IDE管理、开发和保护您的主要Arm工程资产
随着嵌入式系统开发的复杂度不断提升,开发人员参与的项目随时可以超越Cortex-M系列,这对集成开发环境(IDE)也提出了更高的要求,最好能够用一套IDE来管理、开发和保护日益多样化的工程项目。Keil MDK和IAR EWARM是市面上最常见的两款用于Arm Cortex-M MCU开发的集成开发环境。 目前Keil MDK主要支持Arm Cortex-M,对于Arm Cortex-A和Cortex-R的开发,则需要借助Arm Development Studio的支持。 而IAR EWARM作为一款功能强大的IDE,不仅支持Arm Cortex-M系列MCU,还扩展了对Cortex-A和Cortex-R处理器的支持。对于需
[嵌入式]
用一套IDE管理、<font color='red'>开发</font>和保护您的主要<font color='red'>Arm</font>工程资产
嵌入式开发学习(4)<ARM汇编指令集详解>
数据传送指令:   MOV 两个寄存器之间传递。例 MOV r1,r0,将寄存器r0中的内容赋值给r1。   MVN 同MOV用法一样,区别是MOV是原值传递,而MVN是按位取反后传递。 算数运算指令:   ADD SUB RSB ADC SBC RSC 逻辑指令:   AND ORR EOR BIC   BIC的用法:BIC r0,r1,#0x1f,将r1中的数的bit0到bit4清零后赋值给r0;为什么是bit0到bit4呢,这个是由#0x1f来决定,#0x1f有五个bit位是1。如写成#0xf,就有四个bit位是0。 比较指令:   CMP CMN TST TEQ 比较指令用来比较两个寄存器中的数。特点:比较指令不用后加S后
[单片机]
嵌入式开发学习(3)<ARM汇编指令集语法>
汇编指令分为指令和伪指令 指令:针对于CPU设计的指令。作用在CPU上。 伪指令:针对于编译器设计的指令。作用在编译器上,用来知道编译过程,经过编译后伪指令最终不会生成机器码。要知道,汇编指令是机器指令的助记符,最终要通过编译器翻译成CPU能直接识别的由01组成的代码(机器码)。 LDR/STR架构: ARM采用RISC架构,CPU不能直接操作内存中的内容,而需要先将内存中的内容加载到CPU中的通用寄存器中才能被CPU处理。 LDR(load register)指令将内存中的内容加载的通用寄存器中。 STR(store register)指令与LDR指令相反,将寄存器中的内容存入到内存中。 CPU通过LDR指令和STR指令实现内存
[单片机]
嵌入式<font color='red'>开发</font>学习(3)<<font color='red'>ARM</font>汇编指令集语法>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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