PolarFire SoC mpfs-mmuart-interrupt mss_entry.S 启动流程分析

代码地址:polarfire-soc-bare-metal-examples/driver-examples/mss/mss-mmuart/mpfs-mmuart-interrupt at main · polarfire-soc/polarfire-soc-bare-metal-examples

 

启动文件:/mpfs-mmuart-interrupt/src/platform/mpfs_hal/startup_gcc/mss_entry.S 

 

  1. 从reset_vector开始。

  2. 清除返回地址栈(.clear_ras)。

  3. 设置陷阱向量(trap_vector)。

  4. 禁用中断,初始化一些CSR寄存器。

  5. 根据hartid(核心ID)跳转到不同的栈初始化部分(.hart0, .hart1, ...)。

  6. 初始化栈和HLS(Hart Local Storage)。

  7. 如果是第一个hart(MPFS_HAL_FIRST_HART),则清除内存(DTIM、L2LIM等),配置L2缓存,清除scratchpad,初始化堆。

  8. 然后跳转到main_first_hart。

  9. 其他hart则进入等待循环(.LOtherHartstoWFI),等待第一个hart启动,然后通过WFI等待软件中断,最后跳转到main_other_hart。

 

我的思考:

1、上电复位,polarfire soc 5个核心,都会从 reset_vector 开始运行, 读取 自己的 hart id , 分别 跳到 e51(), u54_1(), u54_2(), u54_3(), u54_4() 运行;

2、我 在 u54_1 使用 汇编指令 修改了 MTVEC 寄存器, 使用 FreeRTOS 中断向量表, 并没有 修改 其他hart  MTVEC , 因此 其他 hart  产生中断 ,还是会 跳到  mss_entry.S   trap_vector 运行;

 

posted on 2025-09-18 18:05  所长  阅读(20)  评论(0)    收藏  举报

导航