修复mcu无法编译的问题
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
add_subdirectory(${ARCH})
|
||||
add_subdirectory(${CONFIG_ARCH})
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
16
mkrtos_knl/arch/cortex-m33/thread_arch.h
Normal file
16
mkrtos_knl/arch/cortex-m33/thread_arch.h
Normal 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;
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user