驱动内存映射修改为缺页模拟方式

This commit is contained in:
zhangzheng
2025-01-26 15:48:13 +08:00
parent 501482c512
commit 7303d5071a
17 changed files with 112 additions and 35 deletions

4
.vscode/launch.json vendored
View File

@@ -71,8 +71,8 @@
// "miDebuggerPath": "/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
// "miDebuggerPath": "/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
// "miDebuggerPath": "/home/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
// "miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
"miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb",
"miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
// "miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb",
"miDebuggerServerAddress": "127.0.0.1:33333",
"MIMode": "gdb",
"setupCommands": [

View File

@@ -193,7 +193,7 @@
"mman.h": "c"
},
"cortex-debug.showRTOS": false,
"cortex-debug.variableUseNaturalFormat": true,
"cortex-debug.variableUseNaturalFormat": false,
"C_Cpp.default.systemIncludePath": [""],
"C_Cpp.default.forcedInclude": ["${workspaceFolder}/build/autoconf.h"]
}

View File

@@ -26,7 +26,8 @@ execute_process(
)
execute_process(
COMMAND cd ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/appfs/src/build.sh && sh build.sh
COMMAND cd ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/appfs/src
COMMAND sh build.sh
COMMAND_ECHO STDOUT
)

View File

@@ -4,6 +4,14 @@
compatible = "at32f43x,pin";
regs = <
0x40020000 0x2000 /*GPIO*/
// 0x4002 1C00 - 0x4002 1FFF GPIO 端口 H
// 0x4002 1800 - 0x4002 1BFF GPIO 端口 G
// 0x4002 1400 - 0x4002 17FF GPIO 端口 F
// 0x4002 1000 - 0x4002 13FF GPIO 端口 E
// 0x4002 0C00 - 0x4002 0FFF GPIO 端口 D
// 0x4002 0800 - 0x4002 0BFF GPIO 端口 C
// 0x4002 0400 - 0x4002 07FF GPIO 端口 B
// 0x4002 0000 - 0x4002 03FF GPIO 端口 A
0x40013800 0x400 /*EXINT & SCFG*/
0x40013C00 0x400 /*EXINT & SCFG*/
0x40023800 0x400 /*CRM*/

View File

@@ -87,33 +87,60 @@ void MemManage_Handler(void)
bool_t is_knl = is_run_knl();
addr_t fault_addr = (addr_t)(SCB->MMFAR);
addr_t bus_addr = (addr_t)(SCB->BFAR);
SCB->MMFAR = 0;
SCB->BFAR = 0;
task_t *cur_task = thread_get_current_task();
bool_t reset_r9 = FALSE;
if ((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2))
if (((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) && (SCB->CFSR & (1 << 7)))
{
if (SCB->CFSR & 0x1)
{
SCB->CFSR |= 0x1;
}
if (SCB->CFSR & 0x2)
{
SCB->CFSR |= 0x2;
}
// printk("instr || data 0x%x access is error.\n", fault_addr);
if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma),
ALIGN_DOWN(fault_addr, PAGE_SIZE), NULL) < 0)
fault_addr, NULL) < 0)
{
printk("task:0x%x, mem_addr:0x%lx bus_addr:0x%lx semgement fault.\n",
printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n",
thread_get_current_task(), fault_addr, bus_addr);
task_knl_kill(thread_get_current(), is_knl);
goto end;
}
return;
}
if ((SCB->CFSR & 8))
{
SCB->CFSR |= 8;
printk("push stack is error.\n");
}
if (SCB->CFSR & 16)
{
SCB->CFSR |= 16;
printk("pop stack is error.\n");
}
if (SCB->CFSR & 32)
{
SCB->CFSR |= 32;
printk("Floating point lazy stack error.\n");
}
task_knl_kill(thread_get_current(), is_knl);
end:
reset_r9 = task_knl_kill(thread_get_current(), is_knl);
if (reset_r9)
{
do
{
__asm__ __volatile__(
"mov r9, %0\n\t"
: /* 无输出操作数 */
: "r"(thread_get_current_task()->mm_space.mm_block) // 输入操作数将value的值传递给R0寄存器
: // 告诉编译器R9寄存器将被修改
);
} while (0);
}
}
/**

View File

@@ -40,33 +40,60 @@ void MemManage_Handler(void)
bool_t is_knl = is_run_knl();
addr_t fault_addr = (addr_t)(SCB->MMFAR);
addr_t bus_addr = (addr_t)(SCB->BFAR);
SCB->MMFAR = 0;
SCB->BFAR = 0;
task_t *cur_task = thread_get_current_task();
bool_t reset_r9 = FALSE;
if ((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2))
if (((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) && (SCB->CFSR & (1 << 7)))
{
if (SCB->CFSR & 0x1)
{
SCB->CFSR |= 0x1;
}
if (SCB->CFSR & 0x2)
{
SCB->CFSR |= 0x2;
}
// printk("instr || data 0x%x access is error.\n", fault_addr);
if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma),
ALIGN_DOWN(fault_addr, PAGE_SIZE), NULL) < 0)
fault_addr, NULL) < 0)
{
printk("task:0x%x, mem_addr:0x%lx bus_addr:0x%lx semgement fault.\n",
printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n",
thread_get_current_task(), fault_addr, bus_addr);
task_knl_kill(thread_get_current(), is_knl);
goto end;
}
return;
}
if ((SCB->CFSR & 8))
{
SCB->CFSR |= 8;
printk("push stack is error.\n");
}
if (SCB->CFSR & 16)
{
SCB->CFSR |= 16;
printk("pop stack is error.\n");
}
if (SCB->CFSR & 32)
{
SCB->CFSR |= 32;
printk("Floating point lazy stack error.\n");
}
task_knl_kill(thread_get_current(), is_knl);
end:
reset_r9 = task_knl_kill(thread_get_current(), is_knl);
if (reset_r9)
{
do
{
__asm__ __volatile__(
"mov r9, %0\n\t"
: /* 无输出操作数 */
: "r"(thread_get_current_task()->mm_space.mm_block) // 输入操作数将value的值传递给R0寄存器
: // 告诉编译器R9寄存器将被修改
);
} while (0);
}
}
/**

View File

@@ -82,14 +82,24 @@ void MemManage_Handler(void)
bool_t is_knl = is_run_knl();
addr_t fault_addr = (addr_t)(SCB->MMFAR);
addr_t bus_addr = (addr_t)(SCB->BFAR);
SCB->MMFAR = 0;
SCB->BFAR = 0;
task_t *cur_task = thread_get_current_task();
bool_t reset_r9 = FALSE;
if ((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2))
if (((SCB->CFSR & 0x1) || (SCB->CFSR & 0x2)) && (SCB->CFSR & (1 << 7)))
{
if (SCB->CFSR & 0x1)
{
SCB->CFSR |= 0x1;
}
if (SCB->CFSR & 0x2)
{
SCB->CFSR |= 0x2;
}
// printk("instr || data 0x%x access is error.\n", fault_addr);
if (task_vma_page_fault(&(thread_get_current_task()->mm_space.mem_vma),
ALIGN_DOWN(fault_addr, PAGE_SIZE), NULL) < 0)
fault_addr, NULL) < 0)
{
printk("[semgement fault] task:0x%x, mem_addr:0x%lx bus_addr:0x%lx .\n",
thread_get_current_task(), fault_addr, bus_addr);
@@ -99,14 +109,17 @@ void MemManage_Handler(void)
}
if ((SCB->CFSR & 8))
{
SCB->CFSR |= 8;
printk("push stack is error.\n");
}
if (SCB->CFSR & 16)
{
SCB->CFSR |= 16;
printk("pop stack is error.\n");
}
if (SCB->CFSR & 32)
{
SCB->CFSR |= 32;
printk("Floating point lazy stack error.\n");
}
end:

View File

@@ -214,7 +214,8 @@ static inline pf_t *thread_get_pf(thread_t *th)
static inline thread_t *thread_get_current(void)
{
umword_t sp = arch_get_sp();
thread_t *th = (thread_t *)(ALIGN_DOWN(sp, CONFIG_THREAD_BLOCK_SIZE));
// thread_t *th = (thread_t *)(ALIGN_DOWN(sp, CONFIG_THREAD_BLOCK_SIZE));
thread_t *th = (thread_t *)((sp / CONFIG_THREAD_BLOCK_SIZE) * CONFIG_THREAD_BLOCK_SIZE);
return th;
}

View File

@@ -1,15 +1,15 @@
#!/bin/bash
export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
# export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# linux build
# export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/
# export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7e-m/fpu
# mac compile
# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/softfp
export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/softfp
# windows compile
# export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/

View File

@@ -1,10 +1,10 @@
#!/bin/bash
export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
# export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
# export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/
# export TOOLCHAIN_LIB=/d/GNUArmEmbeddedToolchain/102021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp

View File

@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.13)
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ")
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 ")
#appfs lib
file(GLOB appfs_src src/appfs.c src/appfs_open.c)

View File

@@ -14,21 +14,21 @@ static int drv_iomem_init(void)
{
addr_t addr;
msg_tag_t tag;
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0),
XMC_MEM_BASE - PERIPH_BASE, PERIPH_BASE, &addr);
if (msg_tag_get_val(tag) < 0)
{
printf("periph mem alloc failed..\n");
return -1;
}
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0),
0x4000000, XMC_MEM_BASE, &addr);
if (msg_tag_get_val(tag) < 0)
{
printf("periph mem alloc failed..\n");
return -1;
}
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0),
0x10000, XMC_REG_BASE, &addr);
if (msg_tag_get_val(tag) < 0)
{

View File

@@ -79,7 +79,7 @@ static int display_test(void)
printf("display addr:0x%x\n", info.display_addr);
msg_tag_t tag;
addr_t addr;
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0),
512, info.display_addr, &addr);
if (msg_tag_get_val(tag) < 0)
{

View File

@@ -81,7 +81,7 @@ add_custom_target(
COMMAND
cp nes.elf ${CMAKE_SOURCE_DIR}/build/output/nes.elf
COMMAND
cp ${CMAKE_CURRENT_SOURCE_DIR}/nes_rom/sm.nes ${CMAKE_SOURCE_DIR}/build/output/cpio/
cp ${CMAKE_CURRENT_SOURCE_DIR}/nes_rom/*.nes ${CMAKE_SOURCE_DIR}/build/output/cpio/
)
add_dependencies(nes_dump nes.elf)

View File

@@ -121,7 +121,7 @@ again:
}
msg_tag_t tag;
addr_t addr;
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0),
512, info.display_addr, &addr);
if (msg_tag_get_val(tag) < 0)
{

View File

@@ -65,7 +65,7 @@ int dev_regs_map(mk_dev_t *dev, void *fdt)
reg[1] = fdt32_to_cpu((fdt32_t)reg_raw[i + 1]);
printf("reg:0x%x size:0x%x\n", reg[0], reg[1]);
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0),
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0),
reg[1], reg[0], &vaddr);
if (msg_tag_get_val(tag) < 0)
{