32位RISC-V处理器代码写1操作是写入数据存储器还是内部寄存器?
RISC-V架构下指针写操作目标位置解答
核心结论
代码中向DEBUG_IF_ADDR(地址值0x00002010)写入1/0的操作,访问的是内存地址空间映射的目标(数据存储器或内存映射的调试接口寄存器),绝不会写入CPU内部的32个通用寄存器。
判断依据
- RISC-V 32位架构的32个内部通用寄存器(x0~x31)是CPU核内的独立硬件单元,仅能通过机器指令的寄存器操作数字段按编号访问,没有分配对应的内存映射地址,C语言层面无法通过指针解引用的方式直接读写这些内部寄存器。
- C语言中对指针解引用赋值的逻辑,编译为RISC-V指令后会生成
sw(存储32位字)类访存指令,这类指令统一走内存访问通路,操作的是全局内存地址空间,和内部寄存器组的访问通路完全隔离。 - 地址
0x00002010属于32位RISC-V的常规可寻址内存范围,该地址最终落到数据RAM还是外设寄存器,取决于所用SoC的地址分配规则,但无论如何都不会路由到CPU内部的32个通用寄存器。
测试代码原文
#include "string.h" #define DEBUG_IF_ADDR 0x00002010 void bubble_sort(int* arr, int len) { int sort_num; do { sort_num = 0; for(int i=0;i<len-1;i++) { if(*(arr+i) > *(arr+i+1)) { int tmp = *(arr+i); *(arr+i) = *(arr+i+1); *(arr+i+1) = tmp; sort_num++; } } } while(sort_num!=0); } int main() { int unsorted_arr[] = {195,14,176,103,54,32,128}; int sorted_arr[] = {14,32,54,103,128,176,195}; bubble_sort(unsorted_arr,7); int *addr_ptr = DEBUG_IF_ADDR; if(memcmp((char*) sorted_arr, (char*) unsorted_arr, 28) == 0) { // 排序成功写标志 *addr_ptr = 1; } else { // 排序失败写标志 *addr_ptr = 0; } return 0; }
补充说明:如果硬件设计中
DEBUG_IF_ADDR被映射为自定义调试标志寄存器,上述写操作可以正常触发对应的标志位置位/清零逻辑。
内容的提问来源于stack exchange,提问作者Hakan
相关产品推荐
相关产品推荐

