Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
中断
启动
nuc980
NK-980IOT之程序执行过程介绍
发布于 2022-03-09 14:37:16 浏览:1024
订阅该版
[tocm] # 程序执行过程介绍 ## 启动过程 工程中配置分散加载文件如下图: ![图片6.png](https://oss-club.rt-thread.org/uploads/20220309/6123d795baa25573270a558d3ef84e86.png) ``` \bsp\nuvoton\nk-980iot\linking_scripts\nuc980.sct下 ER_IROM1 0x00000000 0x800000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } ``` 可以看出`RESET`段代码放在了`ER_IROM1`的区域, 搜索`RESET`,可以找到`\libcpu\arm\arm926\start_rvds.S` 查看内容如下: ``` AREA RESET, CODE, READONLY ARM Entry_Point LDR PC, vector_reset LDR PC, vector_undef LDR PC, vector_swi LDR PC, vector_pabt LDR PC, vector_dabt LDR PC, vector_resv LDR PC, vector_irq LDR PC, vector_fiq vector_reset DCD Reset_Handler ``` 也就是`RESET`段的第一条指令就是, `LDR PC, vector_reset` 即跳入`Reset_Handler`执行。 芯片硬件决定,复位后会从地址`0x00000000`处执行,而分散加载文件将`RESET`段的代码放在了`0x00000000`处,且第一条代码是`LDR PC,vector_reset`。 所以芯片复位后第一条执行的语句就是`LDR PC,vector_reset`,而`vector_reset`标签处的值是`Reset_Handler`,所以就跳转到`Reset_Handler`执行。 再看`Reset_Handler`处的代码,前面有设置各栈模式的指针等,先不管。 后面看到 ``` ; Enter the C code LDR R0, =__main BLX R0 ``` 即跳到`__main`处执行,`__main`是编译器符号,编译器会提供运行环境初始化的代码比如初始化`data`段等,入口是`__main`。`__main`执行完后会跳转到我们熟悉的`main`函数执行。 实际上这里对`main`进行了”重载” 在`\rt-thread\src\components.c`中 ``` extern int $Super$$main(void); /* re-define main function */ int $Sub$$main(void) { rtthread_startup(); return 0; } ``` `$Sub$$main`是编译器符号如果有该符号则`__main`函数中会跳入到`$Sub$$main`执行而不是用户的`main`。 查看`rtthread_startup`的实现,进行了系统运行环境的初始化, 其中`rt_application_init`创建了任务`rt_application_init`, 在`rt_system_scheduler_start`系统调度开始后,会执行任务`rt_application_init`, 在这里最终调用`$Super$$main` ``` extern int $Super$$main(void); $Super$$main(); /* for ARMCC. */ ``` `$Super$$main`即用户的`main`函数。 `$Super$$main`和`$Sub$$main`可以通过菜单栏`[Help]->[uVision Help]`打开帮助文档,搜索查看相关说明。 ![图片7.png](https://oss-club.rt-thread.org/uploads/20220309/0e420788beb3c92df4025ffaf6f53a18.png.webp) ## 中断处理 `\libcpu\arm\arm926\start_rvds.S` ``` IRQ_Handler PROC STMFD SP!, {R0-R12,LR} BL rt_interrupt_enter BL rt_hw_trap_irq BL rt_interrupt_leave ; If rt_thread_switch_interrupt_flag set, ; jump to rt_hw_context_switch_interrupt_do and don't return LDR R0, =rt_thread_switch_interrupt_flag LDR R1, [R0] CMP R1, #1 BEQ rt_hw_context_switch_interrupt_do LDMFD SP!, {R0-R12,LR} SUBS PC, LR, #4 ENDP ``` 前后有一些保护上下文等处理先不管, 进入`rt_hw_trap_irq(\libcpu\arm\arm926\trap.c)` 调用`rt_interrupt_dispatch(\bsp\nuvoton\libraries\nuc980\rtt_port\drv_sys.c)` 根据`irq = rt_hw_interrupt_get_active(fiq_irq)`;查找`REG_AIC_FIQNUM`或`REG_AIC_IRQNUM`寄存器,看当前触发的是哪个中断, 再根据中断号查表执行中断服务函数`isr_func(irq, param)`; 最后`rt_hw_interrupt_ack`设置`REG_AIC_EOIS`或`REG_AIC_EOFS` 对应的中断注册`rt_hw_interrupt_install(\bsp\nuvoton\libraries\nuc980\rtt_port\drv_sys.c)` 就是设置中断服务函数表。 注册中断服务函数调用以下两个API既可 `rt_hw_interrupt_install(i, rt_hw_interrupt_dummy_handler, RT_NULL, (char *)"dummy")`; `rt_hw_interrupt_mask(i)`;
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
使用CmBacktrace定位错误异常,请教分析原因
2
ARM9、raspberry-pi中断问题
3
内联函数不压栈,会因为中断导致栈内现场被破坏吗
4
rt_hw_context_switch_interrupt的逻辑
5
中断的入口程序在哪个文件里?
6
我想实现一个定时器中断,发现rt_hw_interrupt_install未定义
7
临界区和关中断,是否需要同时使用?
8
gpio 引脚一直进中断,请问怎么办呢?
9
RT-Thread那些API可以在中断程序中调用?
10
spi dma 中断接收的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部