uclinux中断和异常向量初始化--------4

S3C44B0X的最小系统构架 2007-12-25 10:02:22 一、前言 ARM7TDMI是世界上广泛使用的32位嵌入式RISC处理器,是目前用于低端的ARM处理器核。它的高性能,低功耗,廉价精简的程序代码一直是市场上的领先者。ARM公司研发了针对ARM图形化的编译器,连接器调试器,这为整个嵌入式系统的开发调试提供了较好的环境。Samsung S3C44B0微处理器是三星公司提供的高 阅读详情
 asmlinkage void __init start_kernel(void)
{
 .....
 trap_init();
 init_IRQ();
 ....
 
中断的初始化主要和这两个函数相关

1. trap_init
在该函数中调用__trap_init((void *)vectors_base());将exception vector设置到vectors_base开始的地址上,该函数位于entry-armv.S文件中,对于我们的板子,是把异常向量拷贝到0x100000000的位置上。
对于arm处理器,共有复位、未定义指令、SWI、预取终止、数据终止、IRQ、FIQ,SWI主要用来实现系统调用,而产生了IRQ之后,通过exception vector进入中断处理过程,主要执行do_IRQ函数。
void __init trap_init(void)
{
 extern void __trap_init(void *);
vectors_base是异常向量的基地址,不同的设计会有不同的值,
 __trap_init((void *)vectors_base());
 if (vectors_base() != 0)
  printk(KERN_DEBUG "Relocating machine vectors to 0x%08x/n",
   vectors_base());
#ifdef CONFIG_CPU_32
 modify_domain(DOMAIN_USER, DOMAIN_CLIENT);-----不知道什么意思
#endif
}
在文件 linux/arch/armnommu/kernel/entry-armv.S
ENTRY(__trap_init)
  stmfd sp!, {r4 - r6, lr}

  mrs r1, cpsr  @ code from 2.0.38
  bic r1, r1, #MODE_MASK @ clear mode bits  坦白讲,这段代码很无聊,我们reset之后一直就是svc模式,disable IRQ,FIQ
  orr r1, r1, #I_BIT|F_BIT|MODE_SVC @ set SVC mode, disable IRQ,FIQ
  msr cpsr, r1

  adr r1, .LCvectors   @ set up the vectors
  ldmia r1, {r1, r2, r3, r4, r5, r6, ip, lr}
  stmia r0, {r1, r2, r3, r4, r5, r6, ip, lr}拷贝异常向量

  add r2, r0, #0x200
  adr r0, __stubs_start  @ copy stubs to 0x200
  adr r1, __stubs_end
1:  ldr r3, [r0], #4
  str r3, [r2], #4
  cmp r0, r1
  blt 1b
  LOADREGS(fd, sp!, {r4 - r6, pc})
从__stubs_start到__stubs_end中,包含了异常处理的代码,所以拷贝到了vectors_base+0x200的位置上


irq_desc数组是用来描述IRQ的请求队列,每一个中断号分配一个irq_desc结构,组成了一个数组。
NR_IRQS代表中断数目。我们的板子共有11个中断,这里只是进行初始化,串口、时钟等具体中断将在下面具体讲述。
void __init init_IRQ(void)
{
 extern void init_dma(void);
 int irq;

 for (irq = 0; irq < NR_IRQS; irq++) {
  irq_desc[irq].probe_ok = 0;
  irq_desc[irq].valid    = 0;
  irq_desc[irq].noautoenable = 0;
  irq_desc[irq].mask_ack = dummy_mask_unmask_irq;
  irq_desc[irq].mask     = dummy_mask_unmask_irq;
  irq_desc[irq].unmask   = dummy_mask_unmask_irq;
 }

 init_arch_irq();----前面已近讲过,此处执行linux/arch/armnommu/mach-***/irq.c文件中的irq_init_irq函数,每个cpu都是自己初始化irq的方式,具体就要看你cpu了,我的处理是这里开时间中断
 init_dma();---也是和cpu相关的,我们没有使用dma,所以~~~呵呵~~~略
}
ARM9 LPC3180嵌入式开发实战:架构解析、外设驱动与调试技巧 在嵌入式系统开发中,微控制器(MCU)的选型与底层驱动开发是构建稳定高效产品的基石。其核心在于理解处理器架构、总线机制与外设协同工作的原理,这直接决定了系统的实时性、功耗与可靠性。ARM9系列处理器凭借其哈佛架构、硬件浮点单元(VFP)及多层AHB总线等设计,在需要中等算力与复杂外设集成的场景中展现出独特的技术价值,广泛应用于工业控制、数据采集网关及消费电子等领域。本文以NXP LPC3180这款经典的ARM926EJ-S芯片为例,深入剖析其包括SDRAM控制器、NAND Flash、USB OTG及DMA 阅读详情

相关推荐

经典嵌入式网络处理器MCF5272:架构解析与物联网网关设计启示

嵌入式系统开发中,处理器架构与外设集成策略是决定系统性能与成本的关键。从经典的CISC/RISC架构到现代SoC设计,其核心在于平衡计算效率、连接能力与功耗。以网络连接控制器为例,集成以太网MAC、USB控制器及丰富通信接口的单芯片方案,能显著降低物联网边缘节点与轻量级网关的开发门槛。这种围绕数据流设计的片上系统,通过硬件DMA加速网络处理、利用QSPI解放CPU负载,为工业控制、智能家居网关等场景提供了高性价比的解决方案。本文以飞思卡尔MCF5272这一经典网络微控制器为切入点,深入剖析其ColdFire

weixin_30915951的博客 457

mips linux trap_init函数分析(转)

CAC_BASE 表明支持CACHE 的base 地址,由于是 32 的 CPU ,所以等于0x80000000; per_cpu_trap_init()中初始化CUP 的TLB cache ,以及它们的异常处理程序; set_handler(0x180, &except_vec3_generic, 0x80)设置通用异常入口(ebase+0x180)的处理程序为except_vec3_generic; 初始化异常处理表exception_handlers;

adaptiver的专栏 4155

深入解析NXP LPC2930:ARM9内核在汽车与工业控制中的实战应用

在嵌入式系统开发中,微控制器(MCU)的选型是平衡性能、成本与可靠性的关键。ARM架构因其生态与性能优势,在实时控制领域广泛应用。其原理在于通过精简指令集与高效总线结构,实现确定性的快速响应。这一技术价值在汽车电子与工业自动化等对实时性要求严苛的场景中尤为突出,例如车身控制、网关节点与现场总线通信。本文聚焦于NXP LPC2930这款基于ARM968E-S内核的经典MCU,它集成了**双通道CAN控制器**、**全速USB 2.0**等关键外设,通过剖析其紧耦合存储器(TCM)、多层AHB总线矩阵及灵活的时

weixin_30847865的博客 360

irq_desc操作

本博客转载自:http://rock3.info/blog/2013/11/17/irq_desc数组的初始化过程/ 这篇博客解析非常精辟,再次表达对原作者的敬意。irq_desc[]数组是linux内核中用于维护IRQ资源的管理单元,它存储了某IRQ号对应的哪些处理函数,属于哪个PIC管理、来自哪个设备、IRQ自身的属性、资源等,是内核中断子系统的一个核心数组,习惯上称其为“irq数组”(个人爱

天使之翼 5398

ARM 向量中断机制在uClinux 下的设计与实现

2007-12-25 09:57:41 摘要:在ARM体系结构中,硬件产生的外部中断( IRQ) 具有单一的程序入口。为了识别中断源,进而运行对应的中断服务例程( ISR) ,程序需读取中断悬挂寄存器,获得中断号。在这种方式中,程序必须通过软件方法对中断悬挂寄存器的每一位进行比较,直到找到中断源为止,效率较低。本文移植了基于2.6.11 内核的uClinux ,在此基础

mybirdsky的专栏 796

linux IRQ Management(五)- irq_desc

了解 IRQ number中断描述符。 1.概念 1.1.通用中断代码处理示意图   通用中断处理的示意图如下:   对于每一个外设的IRQ 都用struct irq_desc来描述,称之为中断描述符。该数据结构保存了关于所有IRQ的中断描述符信息(上图中红色框图内)。   当中断发生时,首先获取触发中断的HW interupt ID,然后通过irq domain译码成IRQ number...

weixin_41028621的博客 2980

uClinux for bf561中的中断处理(1):中断初始化

    在uClinux初始化的过程中,就会配置好相应的中断向量表,并根据用户的配置来设置外部中断的优先级。/* init/main.c */asmlinkage void __init start_kernel(void){…       sort_main_extable();       trap_init();       rcu_init();

嵌云阁 1634

关于三星S3C44B0X目标板的uClinux Bootloader

2007-12-25 09:13:59 uClinux是为控制领域设计的嵌入式Linux操作系统,它沿袭了主流Linux的大部分特性,并进行了一定幅度的裁减。其设计主要针对没有内存管理单元(MMU)的微处理器,例如基于ARM7TDMI内核的S3C44B0X。 嵌入式Linux系统通常由三部份组成:Bootloader、KernelFile System。其中

mybirdsky的专栏 467

Nios II uCLinux/Linux启动分析

1、说明   本文采用的Linux源码版本来自Altera公司FTP。不考虑zImage生成的Compress过程。因为zImage是内核binary文件经过gzip 压缩,并在头部添加解压缩代码实现的。这部分可以在内核代码树的arch/nios2/boot/compress下分析链接脚本及makefile得出。另外,Linux源码中实现了编译MMU版本无MMU版本的Linux,所以编译无M...

weixin_30814223的博客 168

工业级微处理器MCF5373:高集成度嵌入式系统核心架构与应用实战

在嵌入式系统与工业控制领域,微处理器的选型是决定项目成败的关键。其核心在于平衡性能、实时性、可靠性与成本。从原理上看,现代嵌入式处理器通过高度集成的外设模块专用硬件加速器,将计算、通信、控制功能融合于单一芯片,旨在降低系统复杂度并提升能效。这种集成化设计的技术价值在于,它允许开发者构建更紧凑、更可靠的硬件平台,同时通过硬件卸载(如DMA、加密加速)让CPU专注于核心业务逻辑,显著提升系统整体吞吐量实时响应能力。典型的应用场景包括工厂自动化设备、物联网网关、网络化控制终端以及需要丰富通信接口的嵌入式设备。

weixin_33766805的博客 468

MCF520x系列嵌入式MCU:平衡性能、功耗与成本的经典连接性控制器解析

在嵌入式系统开发中,微控制器(MCU)的选型是决定项目成败的关键因素之一,它需要在性能、功耗与成本之间找到最佳平衡点。其核心原理在于通过精简指令集架构、高效的内存管理以及丰富的外设集成,为实时控制网络连接应用提供可靠的硬件基础。这种设计理念的技术价值在于,它使得设备能够在有限的资源下,高效处理复杂协议栈多任务调度,从而满足工业自动化、智能传感等场景对可靠性实时性的严苛要求。以飞思卡尔(现NXP)的MCF520x系列为代表的经典32位MCU,正是这一理念的杰出实践。该系列基于成熟的ColdFire V2

cong84596496的博客 426

ARM学习-TQ2440

最近开始学习ARM9,使用TQ2440,但是发下板子太新了,现成的资料很少啊,学起来比较费劲。 但是没办法啊,慢慢搞吧。先列一些要学的内容,参考亚嵌培训的内容吧 嵌入式系统概述与ARM简介 1 ARM处理器与其他体系结构处理器异同比较 2 ARM芯片选型 3 ARM外围硬件设计 4 ARM程序算法 5 ARM操作系统(uC/OS-II/ARMLinux/uCLinux/W...

kanwoerzi 222

Linux内核中断处理机制--初始化

1、Linux内核从start_kernel函数开始进行初始化 (1)trap_init主要就是异常初始化。 (2)init_IRQ才是中断初始化。 2、trap_init都干了啥呢? void __init trap_init(void) { .... 把向量表拷贝到ffff0000地址 memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); .... 把复杂向量表拷贝到ffff0200 mem.

LuckyDog0623的博客 2384

linux中断子系统 - irq_desc的创建

irq_desc的代码主要在kernel/irq/irqdesc.c中 linux4.6.3 1.irq_desc组织方式irq_desc在内核中有两种组织方式,这是根据宏CONFIG_SPARSE_IRQ是否定义来决定的,这两种方式分别是:(1)radix-tree方式,这是以基数树的方式来组织irq_desc (2)数组的方式 ,前面的文章介绍irq结构时,就是用此方

多媒体开发者 7159

[ARM异常]-linux中(aarch/aarch64)异常向量表介绍

文章目录1、ARM的异常向量表基地址寄存器--VBAR2、ARM的异常向量表的定义3、在linux kernel中设置异常向量表基地址3、在linux kernel中定义异常向量表 1、ARM的异常向量表基地址寄存器–VBAR (armv8) (armv7) 2、ARM的异常向量表的定义 (armv8) (armv7) 3、在linux kernel中设置异常向量表基地址 (armv8) (1)、在head.S中 .set initial_sp, init_thread_union + THREAD_

baron-周贺贺-代码改变世界ctw 6056
上一篇: 中国嵌入式应用市场四大热点及趋势
下一篇: PLL
andyzx
博客等级 码龄21年 30粉丝 29原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值