Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
risc-v_RISCV
rt-smart
博流_BL61x_BL808
求助rt-smart在适配riscv64虚拟地址和物理地址映射关系
发布于 2023-02-15 16:10:24 浏览:874
订阅该版
在bl808适配RT-THREAD master分支上的rt-smart过程中,遇到了虚拟地址和物理地址映射问题,寻求熟悉rt-smart的大佬帮助 BL808使用的是平头哥C906的RISC-V内核 1、当前在未开启`RT_USING_SMART`宏情况下,系统可以在物理地址上正常运行,任务切换正常。 内存物理地址:`0x50000000`,大小64MByte 链接地址:`0x50000000` PLIC物理地址:`0xe0000000` 在启动的时候,boot负责将rtthread这部分代码搬移到内存`0x50000000`。 2、在bsp下开启`RT_USING_SMART`选项,参考`allwinner/d1s`下的配置, (1)修改配置`rtconfig.h`为 ```c #define KERNEL_VADDR_START 0x50000000 #define PV_OFFSET 0x0 ``` (2)在rt_hw_board_init函数中添加 ```c #ifdef RT_USING_SMART rt_hw_mmu_map_init(&rt_kernel_space, (void *)(USER_VADDR_START - IOREMAP_SIZE), IOREMAP_SIZE, (rt_size_t *)MMUTable, 0); rt_page_init(init_page_region); rt_hw_mmu_setup(&rt_kernel_space, platform_mem_desc, NUM_MEM_DESC); #endif struct mem_desc platform_mem_desc[] = { {KERNEL_VADDR_START, KERNEL_VADDR_START + 0x4000000 - 1, KERNEL_VADDR_START + PV_OFFSET, NORMAL_MEM}, {0x1000, 0x4ffff000 - 1, 0x1000 + PV_OFFSET, DEVICE_MEM}, }; ``` 基于以上配置的情况下,RT-SMART宏开启后,写plic之后就会发生异常, ``` Unhandled Exception 7:Store/AMO Access Fault scause:0x0000000000000007,stval:0x0000000010201000,sepc:0x00000000500248b4 --------------Dump Registers----------------- Function Registers: ra(x1) = 0x0000000050024cca user_sp = 0x000000005003f840 gp(x3) = 0x000000005003c0a0 tp(x4) = 0x0000000000000000 Temporary Registers: t0(x5) = 0x0000000000004000 t1(x6) = 0x0000000000000000 t2(x7) = 0x0000000000000001 t3(x28) = 0x0000000000000000 t4(x29) = 0x0000000000000000 t5(x30) = 0x0000000000000000 t6(x31) = 0x0000000000000000 Saved Registers: s0/fp(x8) = 0x000000005003f860 s1(x9) = 0x0000000000000000 s2(x18) = 0x0000000000000000 s3(x19) = 0x0000000000000000 s4(x20) = 0x0000000000000000 s5(x21) = 0x0000000000000000 s6(x22) = 0x0000000000000000 s7(x23) = 0x0000000000000000 s8(x24) = 0x0000000000000000 s9(x25) = 0x0000000000000000 s10(x26) = 0x0000000000000000 s11(x27) = 0x0000000000000000 Function Arguments Registers: a0(x10) = 0x0000000000000000 a1(x11) = 0x0000000010201000 a2(x12) = 0x0000000000000004 a3(x13) = 0x0000000000000080 a4(x14) = 0x0000000000000000 a5(x15) = 0x0000000010201000 a6(x16) = 0xfefefefefefefeff a7(x17) = 0x0000000000000007 sstatus = 0x0000000200040100 Supervisor Interrupt Disabled Last Time Supervisor Interrupt Disabled Last Privilege is Supervisor Mode Permit to Access User Page Not Permit to Read Executable-only Page satp = 0x800000000005006f Current Page Table(Physical) = 0x000000005006f000 Current ASID = 0x0000000000000000 Mode = Page-based 39-bit Virtual Addressing Mode -----------------Dump OK--------------------- --------------Thread list-------------- current thread: (NULL) --------------Backtrace-------------- riscv64-unknown-linux-musl-addr2line -e rtthread.elf -a -f 00000000500248b0 ``` 目前关于RT-SMART的资料较少,官网文档中心里面讲的也不是特别详细,想寻求一下大佬支持,谢谢
查看更多
3
个回答
默认排序
按发布时间排序
xiaorui
认证专家
2023-02-15
小睿手办 https://item.taobao.com/item.htm?id=674889867009
写plic的代码是怎样的?
GuEe_GUI
2023-02-15
这家伙很懒,什么也没写!
写了什么地方呀,错误怎么是`Store/AMO Access Fault`
燕十三
2023-02-15
这家伙很懒,什么也没写!
这部分代码在D1S开启MMU之后也是可以正常使用的。 在BL808没有开启MMU也是可以正常使用的,所以我怀疑是不是虚拟地址和物理地址转换没有处理好 在运行 `writel(threshold, handler->hart_base + CONTEXT_THRESHOLD);` 这句话就异常了 ```c void plic_init(void) { int nr_irqs; int nr_context; int i; unsigned long hwirq; int cpu = 0; if (c906_plic_regs) { LOG_E("plic already initialized!"); return; } nr_context = C906_NR_CONTEXT; c906_plic_regs = (void *)C906_PLIC_PHY_ADDR; if (!c906_plic_regs) { LOG_E("fatal error, plic is reg space is null."); return; } nr_irqs = C906_PLIC_NR_EXT_IRQS; for (i = 0; i < nr_context; i ++) { struct plic_handler *handler; uint32_t threshold = 0; cpu = 0; /* skip contexts other than supervisor external interrupt */ if (i == 0) { continue; } // we always use CPU0 M-mode target register. handler = &c906_plic_handlers[cpu]; if (handler->present) { threshold = 0xffffffff; goto done; } handler->present = RT_TRUE; handler->hart_base = c906_plic_regs + CONTEXT_BASE + i * CONTEXT_PER_HART; handler->enable_base = c906_plic_regs + ENABLE_BASE + i * ENABLE_PER_HART; done: /* priority must be > threshold to trigger an interrupt */ writel(threshold, handler->hart_base + CONTEXT_THRESHOLD); for (hwirq = 1; hwirq <= nr_irqs; hwirq++) { plic_toggle(handler, hwirq, 0); } } /* Enable supervisor external interrupts. */ set_csr(sie, SIE_SEIE); } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
874
关于作者
燕十三
这家伙很懒,什么也没写!
提问
4
回答
15
被采纳
0
关注TA
发私信
相关问题
1
studio能否支持risc-v的工程,包括调试。
2
移植rt-nano至risc-v时,无法在main函数创建用户线程
3
risc-v移植rtthread,程序莫名跳转到异常Exception
4
GD32VF103出现to free a bad data block:错误
5
rtt os riscv Store address misaligned异常
6
仅实现机器模式的芯片是否可以移植RT-THREAD系统
7
nano版本移植finsh(基于risc-v)
8
C++在多核下cout打印引起崩溃
9
RT-SMART求助
10
RT-Thread在RISC-V架构的芯片上有成熟的市场项目吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
[E/app.filesystem] SD card mount to '/sdcard' failed!
2
单片机也能聊天?RT-Thread上跑通大语言模型
3
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
4
Rt-thread中OTA下载后,bootloader不搬程序
5
ulog 日志 LOG_HEX 输出时间改为本地日期时间
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部