🔍 搜索帖子 / 资讯 / 芯片型号…
论坛/开源蜂鸟E203/请问,e203定义的地址空间是虚拟地址还是物理地址?
请问,e203定义的地址空间是虚拟地址还是物理地址?
开源蜂鸟E203 作者 栖梧 发布于 2020-04-05 10:50(2378 天前) 7969 浏览

蜂鸟e203实现的是物理地址,硬件端与软件端的地址分配相同,从而确定软件开发过程中能操作底层寄存器。

硬件端:在总线分发模块sirv_icb1to16_bus定义好各个端口寄存器的地址区间,

软件端:在程序设计的驱动文件platform.h内也有对应地址区间的宏定义

例如:GPIO_REG(GPIO_OUTPUT_VAL) |= (0x1 << RED_LED_OFFSET);

GPIO_REG为基地址,GPIO_OUTPUT_VAL为偏移量,从而确定了要操作的寄存器的绝对地址。

同样地,在做上电复位时,可以配置pc_rtvec使得程序从不同的内存空间启动。

感谢领主文和XQS0927两位大神的帮助!

全部回复 14
领主文
领主文2371 天前 · 1 楼
回复 领主文:

这我不太明白,我是这样理解的哈,可能有不对的地方还请楼主多多指教。外设地址是固定的,比如GPIO就是0x10012000,代码放在flash或者放在RAM里面不影响外设的地址吧。可能是我没太理解,我是从SOC理解来的,我是参考https://www.riscv-mcu.com/campus-campus-courseware-id-3.html的第二章来理解的,要是我这里理解有问题的话还请楼主帮忙指正,我虚心学习一下。

哦哦,看到楼主帖子更新了,感谢楼主的努力付出。

领主文
领主文2371 天前 · 2 楼
回复 栖梧:

嗯嗯我就是在这个地方很疑惑,e203如何确定物理地址?因为e203作为软核可以烧写到不同的存储器,例如在flash内以一段连续地址作为内核空间,那么挂在总线上的外设地址也会随着内核地址的改变而改变,因此我认为需要有一个固定的对应关系,例如像我举例的case语句。e203是如何实现这种关系的,您有所了解吗?

这我不太明白,我是这样理解的哈,可能有不对的地方还请楼主多多指教。外设地址是固定的,比如GPIO就是0x10012000,代码放在flash或者放在RAM里面不影响外设的地址吧。可能是我没太理解,我是从SOC理解来的,我是参考https://www.riscv-mcu.com/campus-campus-courseware-id-3.html的第二章来理解的,要是我这里理解有问题的话还请楼主帮忙指正,我虚心学习一下。

栖梧
栖梧2374 天前 · 3 楼
回复 XQS0927:

你理解的没有错,确实是有一个判断地址映射的分支器模块,你可以看一下e203_subsys_perips.v这个文件,里面实例化了一个sirv_icb1to16_bus的总线分支模块。

找到了,非常感谢!

X
XQS09272374 天前 · 4 楼
回复 栖梧:

我理解的应该有一个类似这样的地址映射(译码)模块,但在RTL内找不到0x10012000这类地址

你理解的没有错,确实是有一个判断地址映射的分支器模块,你可以看一下e203_subsys_perips.v这个文件,里面实例化了一个sirv_icb1to16_bus的总线分支模块。

栖梧
栖梧2375 天前 · 5 楼
回复 领主文:

我明白了,据我理解蜂鸟的设计不是地址映射的,蜂鸟的设计是直接物理地址连出去的,有寄存器来控制gpio复用功能等等。

嗯嗯我就是在这个地方很疑惑,e203如何确定物理地址?因为e203作为软核可以烧写到不同的存储器,例如在flash内以一段连续地址作为内核空间,那么挂在总线上的外设地址也会随着内核地址的改变而改变,因此我认为需要有一个固定的对应关系,例如像我举例的case语句。e203是如何实现这种关系的,您有所了解吗?

领主文
领主文2375 天前 · 6 楼
回复 栖梧:

我理解的应该有一个类似这样的地址映射(译码)模块,但在RTL内找不到0x10012000这类地址

我明白了,据我理解蜂鸟的设计不是地址映射的,蜂鸟的设计是直接物理地址连出去的,有寄存器来控制gpio复用功能等等。

栖梧
栖梧2375 天前 · 7 楼
回复 栖梧:

case(addr) 0x10012000: pc=gpio_port; 0x10013000:pc=uart_port; endcase

我理解的应该有一个类似这样的地址映射(译码)模块,但在RTL内找不到0x10012000这类地址

栖梧
栖梧2375 天前 · 8 楼
回复 栖梧:

嗯嗯是的,外设模块我有看,里面很多变量被加密了,只能大概理解。我的疑问具体来说是这样,以GPIO为例,在软件层(platform.h)我们定义了物理地址0x10012000,这个地址送进处理器,它怎么知道接下来要操作gpio的寄存器呢?处理器访问外设本身是通过逻辑地址,那么逻辑地址和物理地址之间应该有个地址映射(译码)模块,这个在e203是怎么实现的呢?

case(addr) 0x10012000: pc=gpio_port; 0x10013000:pc=uart_port; endcase

栖梧
栖梧2375 天前 · 9 楼
回复 领主文:

rtl里面有的,存放外设 peripherals 模块的 RTL 代码在perips这个文件夹里面,这个算外设的部分,楼主可以去看一下。

嗯嗯是的,外设模块我有看,里面很多变量被加密了,只能大概理解。我的疑问具体来说是这样,以GPIO为例,在软件层(platform.h)我们定义了物理地址0x10012000,这个地址送进处理器,它怎么知道接下来要操作gpio的寄存器呢?处理器访问外设本身是通过逻辑地址,那么逻辑地址和物理地址之间应该有个地址映射(译码)模块,这个在e203是怎么实现的呢?

领主文
领主文2375 天前 · 10 楼
回复 栖梧:

您好,我还有一点困惑,在platform.h中有如下定义: #define GPIO_CTRL_ADDR _AC(0x10012000,UL) 说明GPIO的基地址是0x10012000,但在RTL中没有关于映射地址的定义,也没有GPIO_CTRL_ADDR的定义,那e203处理器是如何识别它就是GPIO的呢?

rtl里面有的,存放外设 peripherals 模块的 RTL 代码在perips这个文件夹里面,这个算外设的部分,楼主可以去看一下。

栖梧
栖梧2376 天前 · 11 楼
回复 领主文:

是这样的,蜂鸟里面没有虚拟地址,所以虚拟地址专门的模块也没有对应的。

您好,我还有一点困惑,在platform.h中有如下定义: #define GPIO_CTRL_ADDR _AC(0x10012000,UL) 说明GPIO的基地址是0x10012000,但在RTL中没有关于映射地址的定义,也没有GPIO_CTRL_ADDR的定义,那e203处理器是如何识别它就是GPIO的呢?

领主文
领主文2377 天前 · 12 楼
回复 栖梧:

谢谢,那给总线分配的地址空间就是虚拟地址吗?因为软核内部要完成一个虚拟地址的映射,这个是哪个模块实现的呢?是总线地址译码器吗?

是这样的,蜂鸟里面没有虚拟地址,所以虚拟地址专门的模块也没有对应的。

栖梧
栖梧2378 天前 · 13 楼
回复 领主文:

这个地址是真实的地址

谢谢,那给总线分配的地址空间就是虚拟地址吗?因为软核内部要完成一个虚拟地址的映射,这个是哪个模块实现的呢?是总线地址译码器吗?

领主文
领主文2378 天前 · 14 楼

这个地址是真实的地址

💡 请 登录 后参与讨论(微信扫码即登录/注册)