RISC-V MCU中文社区

请问,e203定义的地址空间是虚拟地址还是物理地址?

发表于 开源蜂鸟E203 2020-04-05 10:50:30
14
4286
0

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

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

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

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

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

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

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

喜欢0
用户评论 (14)
  • 领主文

    2020-04-12 12:56:19 领主文 1#

    领主文

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

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

  • 领主文

    2020-04-12 12:51:01 领主文 2#

    栖梧

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

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

  • 栖梧

    2020-04-09 16:15:21 栖梧 3#

    XQS0927

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

    找到了,非常感谢!

  • XQS0927

    2020-04-09 13:48:41 XQS0927 4#

    栖梧

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

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

  • 栖梧

    2020-04-08 22:28:30 栖梧 5#

    领主文

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

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

  • 领主文

    2020-04-08 20:11:15 领主文 6#

    栖梧

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

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

  • 栖梧

    2020-04-08 16:19:32 栖梧 7#

    栖梧

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

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

  • 栖梧

    2020-04-08 16:17:12 栖梧 8#

    栖梧

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

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

  • 栖梧

    2020-04-08 16:03:01 栖梧 9#

    领主文

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

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

  • 领主文

    2020-04-08 14:30:55 领主文 10#

    栖梧

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

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

  • 栖梧

    2020-04-08 01:46:31 栖梧 11#

    领主文

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

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

  • 领主文

    2020-04-06 23:00:01 领主文 12#

    栖梧

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

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

  • 栖梧

    2020-04-05 20:10:34 栖梧 13#

    领主文

    这个地址是真实的地址

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

  • 领主文

    2020-04-05 16:23:43 领主文 14#

    这个地址是真实的地址

栖梧

栖梧 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板