修复mcu无法编译的问题

This commit is contained in:
zhangzheng
2024-07-31 23:27:19 +08:00
parent 751a6c0c77
commit 5af20bcdd7
36 changed files with 187 additions and 86 deletions

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13)
add_subdirectory(${ARCH})
add_subdirectory(${CONFIG_ARCH})

View File

@@ -84,20 +84,7 @@ void arch_set_enable_irq_prio(int inx, int sub_prio, int pre_prio)
{
gic2_set_prio(arm_gicv2_get_global(), inx, pre_prio);
}
umword_t arch_get_paddr(vaddr_t vaddr)
{
umword_t paddr;
page_entry_t *pdir = mm_space_get_pdir(&(thread_get_current_task()->mm_space));
umword_t vaddr_align = ALIGN_DOWN(vaddr, PAGE_SIZE);
paddr = mm_get_paddr(pdir, vaddr_align, PAGE_SHIFT);
if (paddr == 0)
{
return paddr;
}
paddr += vaddr - vaddr_align;
return paddr;
}
extern char _data_boot[], _edata_boot[];
extern char _text_boot[], _etext_boot[];
extern char _text[], _etext[];
@@ -165,3 +152,17 @@ static void other_cpu_boot(void)
{
}
}
void dumpstack(void)
{
uint64_t result[5];
umword_t x29;
umword_t status = cpulock_lock();
x29 = read_nmreg(x29);
for (size_t i = 0; i < sizeof(result) / sizeof(umword_t); i++) {
result[i] = (*(umword_t *)(x29 + 8)) - 4;
x29 = *(umword_t *)(x29);
}
printk("[knl dump stack]: 0x%lx,0x%lx,0x%lx,0x%lx,0x%lx\n", result[0], result[1], result[2], result[3], result[4]);
cpulock_set(status);
}

View File

@@ -263,7 +263,6 @@ static inline umword_t arch_get_user_sp(void)
{
return 0;
}
umword_t arch_get_paddr(vaddr_t vaddr);
void arch_disable_irq(int inx);
void arch_enable_irq(int inx);
void arch_set_enable_irq_prio(int inx, int sub_prio, int pre_prio);

View File

@@ -102,3 +102,32 @@ void task_knl_init(task_t *knl_tk)
{
knl_tk->mm_space.mem_dir = *boot_get_pdir();
}
paddr_t task_get_currnt_paddr(vaddr_t vaddr)
{
umword_t paddr;
page_entry_t *pdir = mm_space_get_pdir(&(thread_get_current_task()->mm_space));
umword_t vaddr_align = ALIGN_DOWN(vaddr, PAGE_SIZE);
paddr = mm_get_paddr(pdir, vaddr_align, PAGE_SHIFT);
if (paddr == 0)
{
return paddr;
}
paddr += vaddr - vaddr_align;
return paddr;
}
paddr_t task_get_paddr(task_t *task, vaddr_t vaddr)
{
umword_t paddr;
page_entry_t *pdir = mm_space_get_pdir(&(task->mm_space));
umword_t vaddr_align = ALIGN_DOWN(vaddr, PAGE_SIZE);
paddr = mm_get_paddr(pdir, vaddr_align, PAGE_SHIFT);
if (paddr == 0)
{
return paddr;
}
paddr += vaddr - vaddr_align;
return paddr;
}

View File

@@ -1,4 +1,7 @@
#pragma once
#include <thread.h>
#include <task.h>
void thread_arch_init(thread_t *th, umword_t flags);
umword_t task_get_currnt_paddr(vaddr_t vaddr);
paddr_t task_get_paddr(task_t *task, vaddr_t vaddr);

View File

@@ -38,6 +38,8 @@ typedef struct sp_info
mword_t sp_type; //!< 使用的栈类型
} sp_info_t;
#define _dmb(ins)
#define read_reg(addr) (*((volatile umword_t *)(addr)))
#define write_reg(addr, data) \
do \
@@ -141,6 +143,9 @@ static inline umword_t intr_status(void)
void sys_startup(void);
void sys_reset(void);
static inline void dumpstack(void)
{
}
// systick.c
umword_t sys_tick_cnt_get(void);

View File

@@ -38,6 +38,7 @@ typedef struct sp_info
void *knl_sp; //!< 内核sp
mword_t sp_type; //!< 使用的栈类型
} sp_info_t;
#define _dmb(ins)
#define read_reg(addr) (*((volatile umword_t *)(addr)))
#define write_reg(addr, data) \
@@ -138,7 +139,9 @@ static inline umword_t intr_status(void)
{
return read_sysreg(PRIMASK);
}
static inline void dumpstack(void)
{
}
void sys_startup(void);
void sys_reset(void);

View File

@@ -1,3 +1,16 @@
#pragma once
#include <types.h>
#define THREAD_BLOCK_SIZE CONFIG_THREAD_BLOCK_SIZE //!< 线程块大小,栈在块的顶部
static inline void thread_arch_init(thread_t *th, umword_t flags)
{
}
static inline umword_t task_get_currnt_paddr(vaddr_t vaddr)
{
return vaddr;
}
static inline umword_t task_get_paddr(task_t *tk, vaddr_t vaddr)
{
return vaddr;
}

View File

@@ -1,6 +1,7 @@
cmake_minimum_required(VERSION 3.13)
file(GLOB deps *.c *.S)
list(REMOVE_ITEM deps ${CMAKE_SOURCE_DIR}/mkrtos_knl/arch/${CONFIG_ARCH}/link.lds.S)
add_library(arch STATIC ${deps})
@@ -11,6 +12,7 @@ if (${CONFIG_CPU_TYPE} STREQUAL "swm34s" )
include_directories(
${CMAKE_SOURCE_DIR}/mkrtos_knl/arch/${ARCH}/${CONFIG_CPU_TYPE}
${CMAKE_SOURCE_DIR}/mkrtos_knl/arch/${ARCH}/
${CMAKE_SOURCE_DIR}/mkrtos_knl/inc/knl
${CMAKE_SOURCE_DIR}/mkrtos_bsp/SWM34/SWM341_StdPeriph_Driver/CMSIS/DeviceSupport

View File

@@ -1,8 +1,8 @@
ENTRY(Reset_Handler)
MEMORY
{
RAM (arw) : ORIGIN = 0x20000000, LENGTH = 0x800000
FLASH (arx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 0x10000 - 0x2000
RAM (arw) : ORIGIN = 0x20000000, LENGTH = 0x10000
FLASH (arx) : ORIGIN = 0x00000000 + 0x2000, LENGTH = 0x10000 - 0x2000
}
SECTIONS
{
@@ -67,6 +67,10 @@ SECTIONS
_sdata = .;
*(.data)
*(.data*)
. = ALIGN(0x4);
_pre_cpu_data_start = .;
KEEP (*(.data.per_cpu))
_pre_cpu_data_end = .;
. = ALIGN(4);
_edata = .;
} >RAM AT> FLASH

View File

@@ -13,6 +13,7 @@
#include "types.h"
#include "arch.h"
#define PAGE_SIZE 512
#define LOG_INTR_NO 0 // UART0_IRQn
/// @brief 线程信息
@@ -26,7 +27,7 @@ typedef struct
} pf_s_t;
typedef struct pf
{
umword_t rg1[8]; //!< r4-r11
umword_t regs[8]; //!< r4-r11
pf_s_t pf_s;
} pf_t;
@@ -36,6 +37,7 @@ typedef struct sp_info
void *knl_sp; //!< 内核sp
mword_t sp_type; //!< 使用的栈类型
} sp_info_t;
#define _dmb(ins)
#define read_reg(addr) (*((volatile umword_t *)(addr)))
#define write_reg(addr, data) \
@@ -135,7 +137,9 @@ static inline umword_t intr_status(void)
{
return read_sysreg(PRIMASK);
}
static inline void dumpstack(void)
{
}
void sys_startup(void);
void sys_reset(void);

View File

@@ -0,0 +1,16 @@
#pragma once
#include <types.h>
#define THREAD_BLOCK_SIZE CONFIG_THREAD_BLOCK_SIZE //!< 线程块大小,栈在块的顶部
static inline void thread_arch_init(thread_t *th, umword_t flags)
{
}
static inline umword_t task_get_currnt_paddr(vaddr_t vaddr)
{
return vaddr;
}
static inline umword_t task_get_paddr(task_t *tk, vaddr_t vaddr)
{
return vaddr;
}

View File

@@ -12,7 +12,6 @@
#include "types.h"
#include "thread.h"
#include "printk.h"
#include "thread_armv7m.h"
#include "app.h"
#include "mm_wrap.h"
#include "arch.h"
@@ -45,7 +44,7 @@ void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram, um
cur_pf->pf_s.xpsr = 0x01000000L;
cur_pf->pf_s.lr = (umword_t)NULL; //!< 线程退出时调用的函数
cur_pf->pf_s.pc = (umword_t)pc | 0x1;
cur_pf->rg1[5] = (umword_t)ram;
cur_pf->regs[5] = (umword_t)ram;
cur_th->sp.knl_sp = ((char *)cur_th + CONFIG_THREAD_BLOCK_SIZE - 8);
cur_th->sp.user_sp = cur_pf;
@@ -53,3 +52,6 @@ void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram, um
// printk("exc_regs:%x %x %x\n", cur_pf->pf_s.pc, cur_th->sp.user_sp, ram);
}
void task_knl_init(task_t *knl_tk)
{
}

View File

@@ -67,6 +67,10 @@ SECTIONS
_sdata = .;
*(.data)
*(.data*)
. = ALIGN(0x4);
_pre_cpu_data_start = .;
KEEP (*(.data.per_cpu))
_pre_cpu_data_end = .;
. = ALIGN(4);
_edata = .;
} >RAM AT> FLASH

View File

@@ -37,6 +37,7 @@ typedef struct sp_info
void *knl_sp; //!< 内核sp
mword_t sp_type; //!< 使用的栈类型
} sp_info_t;
#define _dmb(ins)
#define read_reg(addr) (*((volatile umword_t *)(addr)))
#define write_reg(addr, data) \
@@ -137,7 +138,9 @@ static inline umword_t intr_status(void)
{
return read_sysreg(PRIMASK);
}
static inline void dumpstack(void)
{
}
void sys_startup(void);
void sys_reset(void);

View File

@@ -1,3 +1,16 @@
#pragma once
#include <types.h>
#define THREAD_BLOCK_SIZE CONFIG_THREAD_BLOCK_SIZE //!< 线程块大小,栈在块的顶部
static inline void thread_arch_init(thread_t *th, umword_t flags)
{
}
static inline umword_t task_get_currnt_paddr(vaddr_t vaddr)
{
return vaddr;
}
static inline umword_t task_get_paddr(task_t *tk, vaddr_t vaddr)
{
return vaddr;
}