求助!ARM中如何使用寄存器在主函数和中断服务程序中传递数据?
直接用ADS写一段代码,由GPIO发出电平信号,经过较长一段导线后,触发中断。主要功能是在信号发出到触发中断的这段时间里,对CPU执行的指令数量进行计数。个人认为直接用C来写是无法完成的,因为一个 "tickCount++" 经过编译会变成3个lrd和一个str命令,对内存的操作没有几十纳秒是完不成的。所以想在C中嵌入汇编,直接用寄存器进行累加计算,当中断触发时,再将这个寄存器的值读出。
2 主要代码:
int main(void)
{
......
Init() //初始化IO口,设置中断
__asm
{
mov r5, 0x0 //对寄存器R5赋初值
}
rGPFDAT = 0x0; //写入IO口,转换电平
__asm
{
branch:
add r5, r5, #1 //对寄存器R5进行累加
b branch //跳转
}
}
void __irq intSrv(void)
{
......
__asm
{
mov r4, #0x30005cdc //指定变量地址
str r5, [r4] //存储寄存器数值
}
......
}
3 问题描述:
代码写好后,用debug方式编译,然后用AXD进行调试,对C语句显示反汇编代码,发现main函数中 add r5, r5, #1 这行代码经过编译后,已经被替换成 nop 命令。看来是在C中直接操作寄存器不符合编译规则,所以把这条命令给 nop 掉了。
4 问题提出:
4.1 能不能让编译器不把 add 这条命令 nop 掉?
4.2 在上述情况下,如何在主程序和中断服务程序间,不通过内存传输数据?
4.3 有没有其他方法能够实现计算信号传输中执行指令数目的功能?
希望高手能够解答,不胜感激!
相关推荐
ARM处理器数据通路与指令周期深度解析:从核心原理到性能优化
在计算机体系结构中,数据通路是CPU执行指令的核心硬件路径,负责数据在寄存器、运算单元和内存之间的流动。其工作原理基于指令周期,通过取指、译码、执行、写回等阶段协同完成计算任务。理解数据通路对于优化程序性能、降低功耗至关重要,尤其在嵌入式系统和实时计算场景中。本文以ARM架构为例,深入剖析其数据通路设计,涵盖桶形移位器、流水线冲突等关键组件与机制,并探讨如何通过指令选择和内存访问优化提升执行效率。掌握这些底层知识,有助于开发者在资源受限环境下编写高性能代码,并能够从硬件时序层面诊断复杂问题。
ARM嵌入式开发实战:从裸机到uClinux的完整学习路径与避坑指南
嵌入式系统开发是连接硬件与软件的关键技术领域,其核心在于通过交叉编译工具链在主机上生成可在目标硬件(如ARM处理器)上运行的代码。理解计算机体系结构、中断机制和内存映射是掌握嵌入式开发的基础。这些技术使得开发者能够直接操作寄存器,控制外设,实现从简单的GPIO控制到复杂的多任务调度。在工程实践中,搭建稳定的开发环境(如使用虚拟机安装Linux发行版并配置交叉编译器)是项目成功的首要步骤。通过引入实时操作系统(如uC/OS-II)和嵌入式Linux(如uClinux),开发者可以构建更复杂的应用,并利用NFS
FreeRTOS中断中xQueueSendFromISR的正确使用与错误排查指南
在嵌入式实时操作系统中,中断服务程序(ISR)与任务间的通信是核心机制之一,通常借助消息队列实现数据传递。其原理在于,ISR运行于中断上下文,独立于内核调度器,因此必须使用非阻塞的专用API(如FreeRTOS的FromISR系列函数)以避免引发任务调度或阻塞,确保系统的实时性与确定性。这项技术的核心价值在于,它能安全、高效地完成硬件事件到任务逻辑的即时通知与数据交换,是中断响应与任务处理解耦的关键。典型的应用场景包括传感器数据采集、串口通信接收、定时器事件触发等,其中ISR负责快速接收硬件数据,并通过队列
ARM RealMonitor实时调试:LPC214x中断不暂停的嵌入式开发利器
在嵌入式系统开发中,实时调试是提升开发效率、保障系统稳定性的关键技术。传统JTAG调试器通过暂停CPU核心来检查程序状态,虽然功能强大,但会完全中断实时任务,这在调试电机控制、通信协议等对时序要求苛刻的场景中成为瓶颈。其原理是通过硬件断点触发调试状态,导致所有中断响应停止。为解决这一痛点,ARM推出了RealMonitor技术,它在不停止中断服务程序(ISR)的前提下,允许开发者单步执行和观察前台任务,实现了真正的实时调试。这项技术的核心价值在于最小化调试行为对系统实时性的侵入,让开发者能在系统近乎全速运行
ARM Cortex-M嵌入式开发:Kinetis SDK分层架构与实战指南
在嵌入式系统开发中,硬件抽象层(HAL)和驱动层是构建可移植、可维护代码的核心设计模式。HAL层通过封装底层寄存器操作,为上层提供统一的硬件访问接口,实现硬件无关性;驱动层则在HAL之上构建有状态管理,提供面向应用场景的高级API。这种分层架构的技术价值在于显著提升代码复用率、降低跨平台移植成本,并简化复杂外设(如UART、ADC)的使用。在ARM Cortex-M微控制器开发中,官方SDK(如NXP Kinetis SDK)通常采用此设计,尤其适用于需要快速迭代的工业控制、物联网设备等场景。本文以Kine


驱动开发/核心开发
