关于NIOS中断服务函数中的变量在main函数中没有变化的问题

FPGA软核处理器开发全链路解析:从Nios II配置到ModelSim仿真调试 软核处理器是以硬件描述语言实现的CPU核心,可在FPGA逻辑资源中灵活配置,是构建片上可编程系统的关键技术。其核心原理是通过可综合的HDL代码描述处理器微架构,允许开发者根据应用需求定制指令集、外设和内存子系统,实现硬件加速与软件控制的协同。这一技术价值在于突破了固定架构硬核的限制,为嵌入式系统提供了极高的设计灵活性和针对性,特别适用于需要复杂控制流、多外设管理或实时操作系统的场景。在FPGA开发中,软核处理器常与IP核集成和仿真验证紧密结合,例如使用Platform Designer进行图形化系统搭建,并 阅读详情

关于NIOS中断服务函数中的变量在main函数中没有变化的问题

关键词:SOPC NIOS 中断
  前段时间做NIOS的PIO中断时遇到一个问题,在中断处理函数中对一个全局变量进行赋值,然后在main函数中的whlie(1)循环中利用该全局变量进行条件判断,再执行其他指令。当main函数执行时遇到中断触发,进入中断服务函数中,对该全局变量进行赋值,接着退出中断,继续执行main函数中的while(1)的指令,但是该全局变量的值并未发生改变。

#include <stdio.h>
#include <altera_avalon_pio_regs.h>
#include <alt_types.h>
#include <unistd.h>
#include <system.h>
#include "sys/alt_irq.h"

alt_u8 led_en;


void key_isr()
{
	alt_u8 data;
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0);   //关闭按键中断
	data = IORD_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE) ;
	if(data == 0x3)
	{

	}
	else if(data & 0x1)
	{
		led_en = 1;

	}
	else if(data & 0x2)
	{
		led_en = 0;
		IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 0);
	}
	IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0x3);   //清零所有捕获位
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0X3);   //打开按键中断
}


int main(void)
{ 

    alt_ic_isr_register(KEY_IRQ_INTERRUPT_CONTROLLER_ID,
                            KEY_IRQ,
							key_isr,
                            0,
                            0);



	IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_BASE, 0xf); //设置方向为输出
	IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, 0x3);  //清零所有捕获位
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0X3);   //打开按键中断
    while(1)
    {
    	if(led_en == 1)
    	{
    		IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 0xf);
    		usleep(1000000);
    		IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 0);
    		usleep(1000000);
    	}
    }


  return 0;
}

  如上述代码中,led_en为该全局变量,while(1)中为led闪烁的代码,当程序进入中断时,中断服务函数key_isr会将led_en的值变为1,退出中断后,执行main函数中的循环。但在实际执行中,中断服务函数已将led_en赋值为1,但在main函数中led_en的值并未被读取到。因此在while循环中的if判断语句一直为false。
  经过分析后发现导致该问题发生的原因是在Eclipse中编译程序时,会对程序进行一定程度的优化。例如如下代码:XBYTE[2]=0x55; XBYTE[2]=0x56; XBYTE[2]=0x57; XBYTE[2]=0x58;。
  对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致;当变量在因别的线程而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。

  因此针对该问题,解决方法有两种:一:关闭程序优化;二:不对该全局变量进行优化。
  方法二比较简单,只需要在定义变量时在前面加上volatile,例如:volatile int led_en;使用volatile定义后的变量,系统在使用时总是重新从它所在的内存读取数据,而不是寄存器中,这样就可以避免变量的读取值与实际值不一致。
  方法一需要在Eclipse中关闭代码优化选项,右键工程,选择properties,打开如下所示在这里插入图片描述
在列出的选项中选中Nios Application Properties,将Optimization level 选择为off,点击apply,然后ok保存,接着再编译程序下载就不会出现上述问题。
在这里插入图片描述
总结
  一个函数用了一个外部的变量,但这个变量在此函数中没有改变,只是引用,这时候编译器会去做优化,把它的值暂放在内部寄存器中,用的时候读取的是寄存器的值,而不是去访问它的地址取值,这样的话,当这个变量在外部发生了变化的时候,比如中断,或者另外的进程等等。但在这个函数里面就不能起作用,因为被优化后使用的是寄存器的值,还是原来的值,导致错误发生。这种情况下,就要加上这个volatile定义,就不会被优化了。

FPGA软核开发实战:从NIOS II入门到自定义外设设计 在嵌入式系统设计中,CPU软核与硬核是两种核心实现方式。硬核是物理固化的处理器电路,性能确定但不可更改;软核则以硬件描述语言实现,可在FPGA的可编程逻辑中动态构建,其最大优势在于极致的可定制性与灵活性。这种灵活性催生了SOPC(可编程片上系统)的设计哲学,它允许开发者将处理器、存储器、外设控制器等全部集成于单一FPGA芯片内,从而实现系统的小型化、低功耗与硬件加速。从技术价值看,SOPC开发采用独特的硬件与软件双线程并行模型,要求开发者同步推进硬件系统搭建与软件程序编写,这显著提升了复杂嵌入式系统的设计效 阅读详情

相关推荐

FPGA软核处理器实战:从Nios II系统搭建到软硬件协同仿真

软核处理器是FPGA实现嵌入式系统的核心组件,它通过可编程逻辑资源构建CPU,实现了硬件任务与软件任务的分离。其原理在于利用HDL描述的可综合CPU设计,通过总线(如Avalon)集成外设IP核,形成可定制的片上系统(SoC)。这项技术的价值在于极大提升了系统的灵活性和可扩展性,使得功能迭代可通过修改软件而非重新设计硬件来完成,显著缩短开发周期。在应用场景上,它广泛用于协议解析、算法调度、用户交互等复杂控制场景,是连接FPGA底层硬件与上层应用软件的关键桥梁。本文以Nios II软核处理器为例,深入解析了I

cmff98425的博客 424

单片机中断函数中的全局变量问题

第一次写博客。 今天碰到一...

weixin_43635713的博客 9021

基于Avalon-MM总线定制FPGA IP核:从Verilog到NIOS II驱动的PWM外设开发全流程

在FPGA-SoC系统设计中,自定义外设IP核是实现特定功能、提升系统灵活性的关键技术。其核心在于理解并实现处理器总线协议,如Intel(Altera)平台广泛采用的Avalon-MM总线。该协议定义了主从设备间通过地址映射进行读写通信的标准化信号集,包括片选、读写使能、字节使能等,确保了软硬件协同的高效与可靠。掌握Avalon-MM从设备接口设计,使工程师能够将任意用户逻辑(如算法加速器、协议控制器)封装为处理器可寻址的标准外设,从而突破标准IP库的限制,实现高度定制化的系统功能。本文以PWM(脉宽调制)

weixin_30629653的博客 642

STM32中,关于中断函数调用全局变量的问题

本人菜鸟小白一枚,第一次记录自己在学习中遇到的问题,也当是与各位交流交流。首先是问题的描述:硬件单片机型号,STM32F103VET6,IDE:keil 5。想通过它实现的一个功能是,通过两个按键控制一个RGB灯的闪烁开始和停止。两个按键通过外部中断上升沿检测,贴一下最开始的代码。  void KEY1_IRQHandler(void){  //确保是否产生了EXTI Line中断    if(E...

leo_liu006的博客 2万+

NiosII定时器中断实战:从硬件配置到软件驱动的完整指南

在嵌入式系统开发中,定时器和中断是实现精准时序控制与实时响应的两大核心技术。其原理在于通过硬件计数器在达到预设值时触发中断请求,使处理器能够暂停当前任务,转而执行高优先级的特定服务程序。这项技术的核心价值在于为系统提供了确定性的时间基准和异步事件处理能力,是实现多任务调度、数据采集、通信协议解析等复杂功能的基石。在FPGA-SoC应用场景中,Altera/Intel的NiosII软核处理器结合其Interval Timer IP核,为开发者提供了灵活的定时中断解决方案。本文将深入解析NiosII定时器中断的

weixin_33800463的博客 396

从8051到RISC-V:FPGA软核处理器设计实践与资源全解析

微控制器(MCU)是嵌入式系统的核心,其本质是通过硬件逻辑实现指令集架构的运算与控制。在FPGA中实现软核处理器,能够将CPU、存储器和外设高度集成,构建可定制的片上系统(SoC)。这一技术不仅有助于深入理解计算机体系结构,更能为特定应用场景提供灵活、高效的硬件解决方案。本文以经典的8051架构和现代RISC-V架构为例,解析开源VHDL/Verilog实现,并详细阐述从环境搭建、仿真验证到上板调试的全流程。通过剖析oc8051等核心项目,读者可以掌握软核集成、总线互联和工具链适配等关键工程实践,最终具备自

weixin_30892889的博客 612

当主函数与中断函数共享变量问题

 当时开发的一个产品,一项功能是在通电后播放40秒的语音.测试时发现,大约通电70-80次就有一次播放时间不够40秒就提前停止。当时以为复位有问题,换了复位片,没好。又先后换了CPU,语音芯片,还有电源,都没有好转。排除了硬件芯片原因导致的此现象.后来又从软件中查找原因。反复查找软件逻辑,也没发现问题。后来偶然发现在主while里增加大量延时后,稳定性提高。几乎不再出现问题。但是我还是

学海无涯,回头是岸........ 1万+

Python自动登录实战:基于Cookie与Requests库的会话保持与状态管理

在网络自动化与数据采集领域,会话状态管理是核心基础。其原理基于HTTP协议中的Cookie机制,服务器通过Set-Cookie响应头向客户端下发凭证,客户端在后续请求中携带此凭证以维持身份识别。这项技术的工程价值在于实现身份验证的自动化,显著提升操作效率,广泛应用于数据抓取、自动化测试和日常办公自动化等场景。本文聚焦Python环境下的具体实现,详细解析如何利用Requests库模拟登录流程,通过Session对象管理Cookie,并应对CSRF Token等常见反爬策略,最终构建一个完整的自动登录管理器,

weixin_30565199的博客 434

c语言 中断 局部变量 not allocated,C语言(函数)调用过程(略译)

C语言(函数)调用过程IntroductionA calling sequence is the conventional sequence of instructions that call and return from a procedure. Because programs tend to make many procedure calls, a compiler should ensu...

weixin_42112685的博客 599

基于AXI4-Lite总线在Spartan-6 FPGA上实现自定义IP的实战指南

在嵌入式系统设计中,总线协议是实现处理器与外设高效通信的核心机制。AXI(Advanced eXtensible Interface)作为ARM AMBA总线家族的重要成员,以其高性能、高带宽和可扩展性,成为现代SoC设计的标准互连方案。其中,AXI4-Lite作为其简化子集,专为控制寄存器类外设设计,通过分离的地址、数据和响应通道实现简单的握手机制,特别适合FPGA嵌入式系统中处理器与自定义外设的集成。其技术价值在于提供了标准化的接口,简化了IP核的复用与集成流程,显著提升开发效率。在应用场景上,AXI4

weixin_30535843的博客 442

FPGA实现暗通道先验图像去雾:26套工程源码与硬件优化详解

图像去雾是计算机视觉与图像处理领域的关键技术,旨在从受大气散射影响的图像中恢复清晰场景。其核心原理基于大气散射物理模型,通过估算场景透射率与大气光分量来复原图像。在工程实践中,FPGA因其并行处理能力和低延迟特性,成为实现实时视频去雾的理想硬件平台。本文将暗通道先验这一经典算法进行硬件化,涉及滑动窗口滤波、定点数运算和流水线架构等关键技术,有效平衡了处理速度与资源消耗。该技术可广泛应用于安防监控、自动驾驶及无人机视觉等对实时性要求严苛的场景。本文提供的26套FPGA工程源码,覆盖Xilinx与Intel主流

weixin_33801856的博客 334

全局变量中断原子操作_单片机中,中断服务函数和其它外部程序能不能共同改变全局变量?...

特邀~简单说下吧,这里题主需要弄明白两个问题,第一个,为什么要使用全局变量。第二个,volatile的作用是什么。首先,为什么要使用全局变量,类似这样的一个中断函数,大多出现在定时器或者计数器中,用于计算一段时间或者计算脉冲的数量,那么局部局部变量肯定不行的。每次进中断函数的时候,都会有入栈和出栈的过程,这里不需要深究,只需要知道,如果你在中断函数,或者你自己定的任何一个函数里面,使用的变量,在不...

weixin_42499919的博客 1286

YOLOv11模型导出全流程资源清理与优化实战指南:从临时文件管理到量化剪枝蒸馏及多场景部署最佳实践

本文介绍了YOLOv11模型导出的基础知识,涵盖导出格式(ONNX、TensorRT等)、资源消耗(内存、磁盘、GPU/CPU)及格式对比,并给出监控资源使用和导出多格式的示例代码,为后续优化与部署打下基础。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 46

Nios II定时器中断实战:从硬件配置到软件调试全解析

在嵌入式系统中,定时器中断是实现多任务协作和异步事件处理的核心机制。其原理是通过硬件定时器周期性产生中断信号,使CPU能够从忙等待中解放出来,高效处理周期性任务。这一技术对于提升系统实时性和资源利用率具有重要价值,广泛应用于任务调度、PWM生成、精确延时等场景。本文以Altera Nios II软核处理器为例,深入剖析其定时器外设的硬件架构,详解状态寄存器、控制寄存器等关键组件的配置方法,并提供了完整的中断服务程序编写范式和主程序框架。针对开发中常见的LED不闪烁等问题,文章给出了从软件注册失败到硬件信号追

weixin_34417183的博客 343

技术美术个人笔记(十三)——Houdini金属弯曲模拟

最近接收到使用Houdini自动解算破损/砸坏/扭曲汽车的需求,以此文记录制作金属弯曲自动解算工具时使用的部分节点解析;

小谁的博客 2148

从Android到鸿蒙:UI框架迁移的实战指南与最佳实践

本文为Android开发者提供了将应用UI框架迁移至鸿蒙系统的实战指南。文章深入对比了Android命令式编程与鸿蒙ArkUI声明式编程的核心差异,详细讲解了从环境配置、布局迁移(如RecyclerView转List)、逻辑处理到多设备适配与性能优化的全流程最佳实践,帮助开发者高效完成迁移工作。

weixin_29208077的博客 434

FPGA软核处理器开发实战:从IP核集成到ModelSim仿真全流程

在嵌入式系统与数字电路设计中,处理器核心是实现复杂控制与计算任务的关键组件。其工作原理是通过执行存储在内存中的指令序列,协调外设与数据流,完成特定功能。传统ASIC硬核处理器性能优越但灵活性不足,而FPGA软核处理器技术则提供了在可编程逻辑上定制化实现CPU的解决方案,具有极高的设计自由度与可重构价值。这一技术广泛应用于片上系统原型验证、工业控制、通信接口桥接及计算机体系结构教学等场景。本文聚焦于Nios II软核处理器的开发实践,详细拆解了IP核获取、Platform Designer系统搭建、HAL软件

weixin_30458043的博客 707

TB6600驱动器共阴共阳接法傻傻分不清?一张图搞定STM32与42步进电机的接线避坑指南

本文详细解析了TB6600驱动器共阴共阳接法的本质区别,提供了STM32与42步进电机的高效连接方案。通过实际案例和接线图示,帮助读者避免常见错误,确保驱动器与MCU的安全连接,提升项目稳定性。

weixin_28710999的博客 245

7天零基础FPGA入门:从Verilog到硬件调试的完整实践指南

FPGA(现场可编程门阵列)是一种可通过编程定义硬件功能的可重构芯片,其核心原理在于并行电路设计,而非传统CPU的顺序执行。这种硬件可编程特性使其在高速信号处理、协议转换和算法加速等领域具有不可替代的技术价值。对于初学者而言,掌握FPGA开发的关键在于跨越从软件思维到硬件思维的鸿沟,并熟悉完整的开发工具链。本文以Verilog硬件描述语言和Vivado开发环境为基础,通过LED控制等经典案例,详细讲解了从代码编写、综合实现、引脚约束到比特流下载的完整流程。文中重点介绍了集成逻辑分析仪(ILA)等关键调试工具

张 作强 BLOG 463

MQTT阿里云OTA 调试记录

2.验证,这个验证是什么意思呢,就是阿里云会把你包的信息,比如包大小,streamid(相当于包的识别码),版本号发送给你的设备,然后如果你没发送升级成功的包给阿里云,这里会是一直验证中的状态,那你的设备每次重新连接阿里云,发送connect包给阿里云的时候,阿里云就会发送一次这个验证(upgrade)包。提取到了之后就可以发送请求包了,这个请求包比较坑,也可能是我没付费,他的包一次最多只有1024个字节的数据。之前说了,验证状态下,设备发送connect包给阿里云,阿里云就会发一个upgrade包给你。

qq_42585211的博客 1231

5GS 协议栈 — PFCP 协议 — URR 用量上报规则

目录 文章目录目录URR 用量上报规则UEE 的参数Usage Report 的参数示例 URR 用量上报规则 29244 5.2.2 Usage Reporting Rule URR 的作用? 用来告诉 UPF 如何对 PDR 识别的 SDF 或 Application 业务进行使用量统计信息的上报。CP 收到 Report Information 后,可用于计费或者管控(e.g. 超量限速)等用途。 URR 在哪个流程里下发的? N4 会话建立流程。 N4 会话修改流程。 URR 是怎么工作

烟云的计算 4591

51单片机中断处理函数能否影响全局变量

在用keil4.60写51的定时器中断处理函数的时候,遇到了这么一个纠结的问题,就是我定义了一个全局变量temp,一旦触发定时器中断进入处理函数时将temp=123,在开中断前temp=888,我本用keil调试看看里边的变量变化情况的,无意中发现keil竟然显示不了全局变量,只能显示当前调用函数的局部变量,这样一来靠调试我是完全不知道全局变量的值变成了什么。上网查了一下,竟然有人说中断处理函数不

2621593260的专栏 7863

17、自适应和学习索引:在线物理设计调整的新维度

本文探讨了现代数据库管理系统中自适应索引和数据库裂解的新方法,通过结合学习模型与多臂老虎机(MAB)框架,实现在线物理设计调整。文章详细介绍了自适应索引的工作原理、数据库裂解技术以及如何利用机器学习进行索引选择和优化,并讨论了MAB框架在动态调整索引结构中的应用及其实际案例。

go5gopher的博客 82

C51源程序中中断函数不能进行参数传递,中断函数中包含任何参数声明导致变易出错,但网上都说可以。可能是KEIL改进了。还要注意变量声明和定义的区别。定义包含声明,声明不一定是定义

中断子程序中定义变量,KEIL C51 中也不报错,编译能通过 /* 名称:定时器控制单只LED 说明:LED在定时器的中断例程控制下不断闪烁。 */ #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit LED=P0^0; uchar Tcount; main() { TMOD=0x01; TH0=0x3c; TL0=0xb0...

二进制模----细微行动改变影响世界 1687

2026.1.11:WSL2中Ubuntu发行版的完全卸载干净指南

摘要:本文详细介绍在WSL2中彻底卸载Ubuntu发行版的步骤。首先通过wsl -l -v确认安装的发行版,使用wsl --terminate终止运行后,推荐使用wsl --unregister命令完全删除发行版(包括所有数据)。还可手动检查残留文件位置(如%LOCALAPPDATA%目录),并提供了备份建议(使用wsl --export)。最后说明验证卸载的方法和可选的高级重置操作。整个过程确保彻底清理相关数据并释放磁盘空间。(

拥抱具身智能,昇腾Ascend C 2393

Qt界面美化-飞扬青云自绘控件插件的使用-避免采坑

1、先上一个集成到QtCreater中的效果图: 2、飞扬青云自绘控件插件下载地址:https://gitcode.net/mirrors/feiyangqingyun/qucsdk?utm_source=csdn_github_accelerator 3、集成插件到QtCreater中的方法: (1)、查看自己使用的QtCreater的版本信息,我的:Qt 5.15.2 MSVC2019 64位 (2)插件下载下来后工程预览: 我选择msvc版本的SDK,打开找到匹配的SDK:...

小米的修行之路 2793
下一篇: 基于FPGA驱动TLC5615模块
落花生zz
博客等级 码龄7年 47粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值