- 博客(459)
- 资源 (9)
- 收藏
- 关注
原创 快速查看字符对应的ASCII码
1、借助gdb查看打印字符串用双引号括起来打印单个字符用单引号括起来x 表示十六机制d 表示十进制t 表示二进制2、借助二进制查看软件第一步:把要查看的字符保存到文本文件中第二步:借助二进制查看工具(比如:Hex Editor Neo)进行查看
2024-05-15 21:00:00 511
原创 以RISC-V架构的CLIC中断机制讲解:中断咬尾、中断抢占、中断晚到
中断抢占的条件高特权模式的中断可以抢占低特权模式的中断,不管低特权模式的全局中断是否使能同特权模式的中断,高中断等级的中断要抢占低特权等级的中断,前提是特权模式的全局中断必须要使能中断抢占:前一个中断还在执行时发生了更高等级的中断,立马去执行高等级的中断处理程序,等高等级的中断处理程序执行完毕,再回来执行前一个中断出来程序的剩余部分。
2024-03-22 19:00:00 1200
原创 RISC-V架构中mret、sret、ret三个指令的区别
ret用于函数调用返回,mret和sret用于从高特权模式切换回陷入前的地特权模式。
2024-03-21 19:00:00 1271
原创 QEMU调试——通过获取设备树(dtb文件)查询开发板的外设地址信息
使用qemu时,想快速知道开发板的地址空间映射情况,特别是某些外设控制器的寄存器基地址。
2024-03-07 19:01:13 675
原创 RISC-V架构的不可屏蔽中断(NMI:Non-Maskable Interrupt)介绍
以NMI为例,芯莱处理器的硬件行为在“The overall process of NMI”章节描述。注意,下面的操作在一个周期中同时完成:当发生NMI时,硬件会自动将NMI的编码保存到mcause寄存器中,异常、中断和NMI都有专属的trap ID。NMI的trap ID有两种潜在的值被mmisc_ctl寄存器控制软件可以通过查询Trap ID区分出陷入原因,并且对不同的陷入类型构建对应的处理函数
2024-03-06 19:12:05 1751
原创 RISC-V架构——CLINT中断控制器初始化(直接模式、向量模式)
模式位占用两个bit,其中2和3这两个值是保留的,在有的芯片中,2和3会分别对应CLIC的直接模式和CLIC的向量模式模式位不仅可以决定是直接模式还是向量模式,还可以决定使用CLINT控制器还是CLIC控制。
2024-02-20 18:30:00 1944 1
原创 嵌入式开发——linux系统怎么知道接了多少物理内存?
1、前言linux系统是不知道当前设备接了多少内存,需要bootloader在启动时告诉linux系统感知到当前设备接了多少物理内存有两种方式动态识别(X86架构大多是这种):可以插拔的内存条,bootloader能识别出内存条的容量代码里写死(ARM架构大多是这种):设备的内存是贴片上去的,不支持动态改变,内存的容量在代码里写死(系统工程师在适配程序时要根据实际物理内存容量去修改代码)2、linux系统知道实际物理内存大小的方式设备树中可以通过"/memory"节点来指定内存的起始
2024-02-10 11:36:48 441
原创 链接脚本常用命令(KEEP、MEMORY、PROVIDE、ENTRY、AT、ALIGN等)
【代码】链接脚本常用命令(KEEP、MEMORY、PROVIDE、ENTRY、AT、ALIGN等)
2024-01-31 18:10:08 1513 2
原创 RISC-V架构常见gcc编译选项(-march、-mabi=、-mcmodel、-mlittle-endian、-mbig-endian)
【代码】RISC-V架构常见gcc编译选项(-march、-mabi=、-mcmodel)
2024-01-28 10:35:19 2552
原创 gcc扩展选项__attribute__((interrupt))——指定中断处理函数属性
不使用__attribute__((interrupt))修饰,函数内只需要保存被调用者保存的寄存器使用__attribute__((interrupt))修饰后,只要在函数内使用到的寄存器都必须保存再恢复,会占用更多的栈空间,翻译得到的汇编代码也会增多还可以指定中断处理函数的优化等级:只有中断处理函数才用__attribute__((interrupt))修饰,其余常规函数不要使用。
2024-01-20 15:32:39 1646
原创 获取编译工具链默认的链接脚本
1、ld命令使用“–verbose”参数命令:riscv64-linux-gnu-ld --verbose想使用自己的链接脚本,链接时使用“-T”指定
2024-01-19 22:31:02 439
原创 freeRTOS的栈溢出检测机制
/当前任务使用的栈空间地址,也就是SP指向的地址//记录分配给任务的栈空间的最低地址《freertos任务调度机制深度分析(以RISC-V架构为例)》;在创建任务时,把任务的栈空间赋值成特殊值在切换任务时,检查栈空间的最后一小段是否被改写过如果不是特殊值则说明该段栈空间被使用过,则认为任务栈空间不足,曾经发生过栈溢出上面介绍的两种栈空间溢出检测机制,基本只能检测出是否发生过栈空间溢出,不好定位是何时何地发生栈空间溢出。
2024-01-05 19:00:00 1274
原创 freeRTOS学习资料整理
1、视频资料韦东山的freeRTOS视频:《韦东山freeRTOS系列教程:FreeRTOS的内部机制》;2、文档资料3、硬件平台学谁的视频买谁的开发板使用qemu平台来学习,适合有经验的人,可以节省买开发板的钱
2023-12-25 19:59:38 482
原创 在qemu平台使用gdb调试程序
x:指定gdb的配置文件,这个不是必须的。使用配置文件可以提高调试效率,将每次开始gdb调试都需要输入的命令,提前写到配置文件中。ctrl键 + n:下一条命令(功能和在linux命令行使用“下键”来查看之前输入过的命令)ctrl键 + p:上一条命令(功能和在linux命令行使用“上键”来查看之前输入过的命令)shell + linux命令:在gdb命令行使用linux命令。配置文件实现的效果和在命令行手动敲命令是一样的。
2023-12-16 19:00:00 1462
原创 分配栈空间的三种方式(基于适配qemu的FreeRTOS分析)
1、定义全局的数组定义的全局数组属于bss段,相当于把bss段的一部分作为栈空间,栈空间的大小就是数组的大小如果把栈空间放在bss段,则在bss段清零时会多清零一段地址空间2、在链接脚本中指定用链接脚本在所有段的后面增加stack段,在上一个段的尾部增加_stack_top大小作为栈的最高地址,用_stack_top符号记录栈空间的大小由_stack_size指定栈的所在地址是根据链接时候动态指定的3、直接在代码里指定栈空间起始地址直接在代码中指定栈空间最高位地址,但是没有指
2023-12-11 22:00:00 136
原创 Ubuntu中编译出Windows的可执行程序(.exe)
在嵌入式开发中,交叉编译是很常见的情况,如果你把Windows电脑也看做一块高性能的开发板,那在Ubuntu中编译出Windows上运行的可执行程序也是很好理解的行为。
2023-12-09 23:03:50 1166
原创 freertos任务调度机制深度分析(以RISC-V架构为例)
/就绪链表,configMAX_PRIORITIES是定义的当前支持最大的优先级,数字越大优先级越高//就绪链表有多个,每个优先级有一个就绪链表//两个都是挂起休眠任务的,之所以有两个是为了解决tickCount超过表示范围产生翻转//这是两个链表指针,用于指向上面的两个休眠链表//任务调度器挂起期间解除阻塞条件得到满足的阻塞任务,在任务调度器恢复工作后,//这些任务会被移动到就绪链表组中,变为就绪状态。//这个保存被删除的任务,等待空闲链表去回收资源。
2023-11-29 21:30:00 2083 1
原创 freeRTOS异常处理函数分析(以RISC-V架构进行分析)
1、异常处理函数的注册对RISC-V架构中断不熟悉,可参考博客:《RISC-V架构——中断处理和中断控制器介绍》;2、异常处理函数分析2.1、数调用关系freertos_risc_v_trap_handler //异常处理函数入口 portcontextSAVE_CONTEXT_INTERNAL //保存任务切换上下文 asynchronous_interrupt //异步异常:时钟中断 handle_interrupt //异步异常:时钟中断 portUPDATE_MTIM
2023-11-29 19:00:00 485
原创 freerots启动过程分析(qemu仿真RISC-V架构为例)
汇编文件:FreeRTOSv202212.01\FreeRTOS\Demo\RISC-V-Qemu-virt_GCC\start.S。
2023-11-28 21:30:00 176
原创 freertos任务切换的现场保存、恢复(任务栈空间)深度分析(以RISC-V架构为例)
1、任务控制块在内存中的布局RISC-V架构采用的减栈,即栈向低地址空间生长;在freertos中采用任务控制块(TCB)结构来表示一个任务每个任务有自己的任务栈,任务栈是紧挨着TCB的,且TCB在地址高位,任务栈在地址低位。TCB在地址高位,任务栈在地址低位的原因:xTaskCreate函数中先申请的任务栈,再申请的2、创建任务时初始化任务栈线程函数的地址保存在mepc,这样在切换线程时就会把mepc寄存器中的值写到pc寄存器中,进而执行线程函数线程函数的传参保存在x10寄存
2023-11-27 16:42:29 824
原创 移植freertos到qemu上运行
1、freertos源码下载参考博客:《freertos源码下载和目录结构分析》;2、编译freertos2.1、选择合适的Demofreertos官方已经适配过qemu,所以我们并不需要做源码级别的移植,只需要选择合适的Demo文件夹。2.2、修改Makefile2.3、编译3、在qemu上运行freertosqemu安装可参考博客:《freertos源码下载和目录结构分析》;
2023-11-15 20:26:15 721
原创 freertos源码下载和目录结构分析
1、源码下载下载网址:https://www.freertos.org/zh-cn-cmn-s/;2、源码目录结构3、关键的代码文件
2023-11-15 19:54:00 593
原创 Windows安装svn命令
1、svn命令下载地址https://www.visualsvn.com/downloads/;2、安装svn命令3、测试svn命令是否安装成功
2023-11-08 19:00:00 501
原创 韦东山D1S板子——利用xfel工具初始化内置64MB内存,并直接下载程序到内存运行
(1)最近使用韦东山老师的D1S板子学习RISC-V架构知识,我是结合《RISC-V体系结构编程与实践》这本书的进行学习,其中韦东山老师对书中的代码做了部分移植,到MMU模块就没有在移植书中代码;(2)前面章节移植的代码都是下载到D1S芯片内置的IRAM中运行,后续实验需要将代码搬运至内存中,IRAM大小已经不够了;(3)最初我是想剥离出初始化DDR的代码并添加到工程里,后来发现数据手册里根本没有关于DDR部分的描述。
2023-10-31 19:30:00 318
原创 韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)
全志SDK里是通过代码来构建出jal跳转指令,相较于韦东山老师写的0x0300006f要更灵活,可以根据启动代码的头来动态计算出偏移量;而韦东山老师写的代码,头的大小只能是0x30字节。
2023-10-28 16:00:00 276
原创 RISC-V架构——中断处理和中断控制器介绍
本文不是从零开始讲解中断,对于中断的基本知识不再赘述,对中断不是很了解可以先学习ARM中断的文章。;
2023-10-25 20:45:00 2130
从零开始用C语言实现图片解码播放器源码
2022-08-27
BMP格式转RGB格式源码
2022-08-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人