support application.

This commit is contained in:
root
2023-08-22 00:26:34 +08:00
parent 56e53a1eae
commit 6ee0deb010
56 changed files with 440 additions and 98 deletions

2
.vscode/launch.json vendored
View File

@@ -10,7 +10,7 @@
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb",
"miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-4_9-2014q4/bin/arm-none-eabi-gdb",
"miDebuggerServerAddress": "127.0.0.1:3333",
"MIMode": "gdb",
"setupCommands": [

View File

@@ -96,7 +96,10 @@
"ratio": "c",
"log.h": "c",
"syscall.h": "c",
"scheduler.h": "c"
"scheduler.h": "c",
"thread_armv7m.h": "c",
"printk.h": "c",
"obj_space.h": "c"
},
"cortex-debug.showRTOS": false,
"editor.formatOnSave": true

View File

@@ -4,12 +4,14 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
-Werror \
-D__MPU_PRESENT=1 -DUSE_STDPERIPH_DRIVER=1 \
-DKNL_OFFSET=$ENV{KEN_OFFSET} \
-DKNL_TEXT=$ENV{KNL_TEXT} \
-DINIT_OFFSET=$ENV{INIT_OFFSET} \
-DSMP=1 \
-Wno-unused-parameter \
-Wno-unused-function \
-Wno-unused-variable \
")
set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS})
message(编译参数:${CMAKE_C_FLAGS})
add_subdirectory(arch)
add_subdirectory(drivers)
@@ -23,11 +25,16 @@ add_executable(mkrtos.elf
target_link_libraries(
mkrtos.elf
PUBLIC
$<TARGET_OBJECTS:arch>
$<TARGET_OBJECTS:drv>
$<TARGET_OBJECTS:knl>
$<TARGET_OBJECTS:lib>
knl
arch
drv
lib
)
add_dependencies(mkrtos.elf arch)
add_dependencies(mkrtos.elf drv)
add_dependencies(mkrtos.elf knl)
add_dependencies(mkrtos.elf lib)
set_target_properties(mkrtos.elf PROPERTIES
LINK_FLAGS "-T ${CMAKE_CURRENT_SOURCE_DIR}/stm32f205rft6_link.lds -z max-page-size=0x1000")

View File

@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13)
file(GLOB_RECURSE deps *.c *.S)
add_library(arch OBJECT ${deps})
add_library(arch STATIC ${deps})
target_include_directories(
arch
PUBLIC

View File

@@ -38,7 +38,8 @@ void sys_startup(void)
// 初始化systick时钟
SysTick_Config(SystemCoreClock / SYS_SCHE_HZ);
}
INIT_LOW_HARD void arch_init(void)
void arch_init(void)
{
SystemInit();
}
INIT_LOW_HARD(arch_init);

View File

@@ -2,7 +2,7 @@
.cpu cortex-m3
.thumb
.global syscall_handler_get
/**
* @brief syscall结束时到这儿
*/
@@ -75,7 +75,7 @@ SYS_CALL:
mov r1, r7
//syscall
push {r0-r2,lr}
blx get_syscall_handler
blx syscall_handler_get
mov r3,r0
pop {r0-r2,lr}

View File

@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13)
file(GLOB_RECURSE deps *.c *.S)
add_library(drv OBJECT ${deps})
add_library(drv STATIC ${deps})
target_include_directories(
drv
PUBLIC

View File

@@ -122,12 +122,13 @@ static void uart_hardware_flow_rts(USART_TypeDef *USARTx, uint16_t flow)
/* Write to USART CR3 */
USARTx->CR3 = (uint16_t)tmpreg;
}
static uart_t uart;
static uart_t uart = {
.baud = 115200};
uart_t *uart_get_global(void)
{
return &uart;
}
INIT_HIGH_HAD void uart_init(uart_t *uart)
void uart_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
@@ -158,7 +159,7 @@ INIT_HIGH_HAD void uart_init(uart_t *uart)
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = uart->baud;
USART_InitStructure.USART_BaudRate = uart.baud;
USART_InitStructure.USART_WordLength = USART_WordLength_8b /*TODO:*/;
USART_InitStructure.USART_StopBits = USART_StopBits_1 /*TODO:*/;
USART_InitStructure.USART_Parity = USART_Parity_No /*TODO:*/;
@@ -167,9 +168,9 @@ INIT_HIGH_HAD void uart_init(uart_t *uart)
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
// reg_isr_func(USART1_IRQHandler, USART1_IRQn + 1, 0);
}
INIT_HIGH_HAD(uart_init);
void uart_set(uart_t *uart)
{
uart_set_baud(USART1, uart->baud);

31
mkrtos_knl/inc/knl/app.h Normal file
View File

@@ -0,0 +1,31 @@
#pragma once
#include "types.h"
typedef struct app_info
{
const char d[32];
const char magic[8];
union
{
struct exec_head_info
{
umword_t ram_size;
umword_t heap_offset;
umword_t stack_offset;
umword_t heap_size;
umword_t stack_size;
umword_t data_offset;
umword_t bss_offset;
umword_t got_start;
umword_t got_end;
umword_t rel_start;
umword_t rel_end;
umword_t text_start;
} i;
const char d1[128];
};
const char dot_text[];
} app_info_t;
app_info_t *app_info_get(void *addr);

View File

@@ -1,3 +1,3 @@
#pragma once
#define SYS_SCHE_HZ 1000 //!< 系统调度频率
#define SYS_SCHE_HZ 100 //!< 系统调度频率

View File

@@ -14,3 +14,4 @@
mem_t *mm_get_global(void);
void global_reg_kobj(kobject_t *kobj, int inx);
kobject_t *global_get_kobj(int inx);

View File

@@ -1,11 +1,20 @@
#pragma once
typedef void (*init_func)(void);
void sys_call_init(void);
#define INIT_LOW_HARD __attribute__((constructor(101)))
#define INIT_HIGH_HAD __attribute__((constructor(102)))
#define INIT_MEM __attribute__((constructor(103)))
#define INIT_KOBJ_MEM __attribute__((constructor(104)))
#define INIT_KOBJ __attribute__((constructor(105)))
#define INIT_STAGE1 __attribute__((constructor(106)))
#define INIT_STAGE2 __attribute__((constructor(107)))
#define INIT_LOW_HARD(f) __attribute__((__section__(".init_array." \
"102"))) init_func init_##f = f
#define INIT_HIGH_HAD(f) __attribute__((__section__(".init_array." \
"103"))) init_func init_##f = f
#define INIT_MEM(f) __attribute__((__section__(".init_array." \
"104"))) init_func init_##f = f
#define INIT_KOBJ_MEM(f) __attribute__((__section__(".init_array." \
"105"))) init_func init_##f = f
#define INIT_KOBJ(f) __attribute__((__section__(".init_array." \
"106"))) init_func init_##f = f
#define INIT_STAGE1(f) __attribute__((__section__(".init_array." \
"107"))) init_func init_##f = f
#define INIT_STAGE2(f) __attribute__((__section__(".init_array." \
"108"))) init_func init_##f = f

View File

@@ -4,3 +4,5 @@
void *mm_limit_alloc(ram_limit_t *limit, size_t size);
void mm_limit_free(ram_limit_t *limit, void *mem);
void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align);
void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size);

View File

@@ -25,6 +25,8 @@ typedef struct obj_map_entry
slist_head_t node;
} obj_map_entry_t;
#define obj_map_kobj_get(kobj) ((kobject_t *)((((umword_t)(kobj)) >> 2) << 2))
static inline void obj_map_entry_init(obj_map_entry_t *entry, kobject_t *obj)
{
slist_init(&entry->node);

View File

@@ -17,7 +17,9 @@
#define LOG_PROT 4
#define IPC_PROT 5
#define FACTORY_PORT_START FACTORY_PROT
#define FACTORY_FUNC_MAX (IPC_PROT + 1)
#define FACTORY_PORT_END FACTORY_FUNC_MAX
typedef union msg_tag
{

View File

@@ -33,6 +33,6 @@ typedef struct scheduler
scheduler_t *scheduler_get_current(void);
void scheduler_init(void);
sched_t *scheduler_next(sched_t *cur);
void scheduler_add(scheduler_t *sched, sched_t *node);
sched_t *scheduler_next(void);
void scheduler_add(sched_t *node);
void scheduler_del(sched_t *node);

View File

@@ -1,7 +1,11 @@
#pragma once
#include "types.h"
typedef struct entry_frame
{
mword_t r[6];
mword_t r[8];
} entry_frame_t;
typedef int (*syscall_entry_func)(entry_frame_t entry);
int syscall_entry(entry_frame_t entry);

View File

@@ -15,3 +15,4 @@ typedef struct task
task_t *thread_get_current_task(void);
void task_init(task_t *task, ram_limit_t *ram);
task_t *task_create(ram_limit_t *lim);

View File

@@ -0,0 +1,3 @@
#pragma once
void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram);

View File

@@ -25,3 +25,5 @@
#define container_of(ptr, type, member) \
((type *)(((umword_t)(ptr)) - ((umword_t)(&(((type *)0)->member)))))
#define USED __attribute__((used))

View File

@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.13)
file(GLOB_RECURSE deps *.c *.S)
add_library(knl OBJECT ${deps})
add_library(knl STATIC ${deps})
target_include_directories(
knl
PUBLIC

7
mkrtos_knl/knl/app.c Normal file
View File

@@ -0,0 +1,7 @@
#include "types.h"
#include "app.h"
app_info_t *app_info_get(void *addr)
{
return (app_info_t *)addr;
}

View File

@@ -22,11 +22,11 @@ static factory_func factory_func_list[FACTORY_FUNC_MAX];
* @brief 在系统初始化时调用
*
*/
INIT_KOBJ_MEM void factory_mem_init(void)
void factory_mem_init(void)
{
// Nothing.
}
INIT_KOBJ_MEM(factory_mem_init);
void factory_register(factory_func func, int inx)
{
assert(inx >= 0);
@@ -135,11 +135,12 @@ static kobject_t *factory_create_func(ram_limit_t *lim, umword_t arg0, umword_t
return &kobj->kobj;
}
INIT_KOBJ static void root_factory_init(void)
static void root_factory_init(void)
{
factory_init(&root_factory, 0);
global_reg_kobj(&root_factory.kobj, FACTORY_PROT);
}
INIT_KOBJ(root_factory_init);
factory_t *root_factory_get(void)
{
return &root_factory;
@@ -148,7 +149,8 @@ factory_t *root_factory_get(void)
* @brief 工厂注册函数
*
*/
INIT_KOBJ static void factory_factory_register(void)
static void factory_factory_register(void)
{
factory_register(factory_create_func, FACTORY_PROT);
}
INIT_KOBJ(factory_factory_register);

View File

@@ -23,14 +23,22 @@ void global_reg_kobj(kobject_t *kobj, int inx)
assert(inx < FACTORY_FUNC_MAX);
kobj_ls[inx - 1] = kobj;
}
kobject_t *global_get_kobj(int inx)
{
assert(inx >= 0);
assert(inx < FACTORY_FUNC_MAX);
return kobj_ls[inx - 1];
}
mem_t *mm_get_global(void)
{
return &global_mem;
}
INIT_MEM static void mem_sys_init(umword_t st_addr, size_t size)
extern void log_dump(void);
static void mem_sys_init(void)
{
log_dump();
mem_init(&global_mem);
mem_heap_add(mm_get_global(), mem_block, sizeof(mem_block));
}
INIT_MEM(mem_sys_init);

View File

@@ -9,5 +9,5 @@ void sys_call_init(void)
uintptr_t a = (uintptr_t)&__init_array_start;
for (; a < (uintptr_t)&__init_array_end; a += sizeof(void (*)()))
(*(void (**)(void))a)();
((init_func)(*(uintptr_t *)a))();
}

View File

@@ -143,7 +143,8 @@ static kobject_t *ipc_create_func(ram_limit_t *lim, umword_t arg0, umword_t arg1
* @brief 工厂注册函数
*
*/
INIT_KOBJ static void ipc_factory_register(void)
static void ipc_factory_register(void)
{
factory_register(ipc_create_func, IPC_PROT);
}
INIT_KOBJ(ipc_factory_register);

View File

@@ -10,8 +10,8 @@
#include "log.h"
#include "factory.h"
#include "kobject.h"
#include "init.h"
#include "globals.h"
#include "init.h"
#include "printk.h"
static log_t log;
@@ -24,12 +24,13 @@ enum log_op
static msg_tag_t
log_syscall(kobject_t *kobj, ram_limit_t *ram, entry_frame_t *f);
INIT_KOBJ static void log_reg(void)
static void log_reg(void)
{
kobject_init(&log.kobj);
log.kobj.invoke_func = log_syscall;
global_reg_kobj(&log.kobj, LOG_PROT);
}
INIT_KOBJ(log_reg);
static msg_tag_t log_write_data(log_t *log, const char *data, int len)
{
for (int i = 0; i < len; i++)
@@ -64,4 +65,8 @@ log_syscall(kobject_t *kobj, ram_limit_t *ram, entry_frame_t *f)
}
return tag;
}
void log_dump(void)
{
}

View File

@@ -28,3 +28,25 @@ void mm_limit_free(ram_limit_t *limit, void *mem)
mem_free(mm_get_global(), (char *)mem - sizeof(size_t));
ram_limit_free(limit, size);
}
void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align)
{
if (ram_limit_alloc(limit, size) == FALSE)
{
return NULL;
}
void *new_mem = mem_alloc_align(mm_get_global(), size + sizeof(size_t), align);
if (!new_mem)
{
ram_limit_free(limit, size);
return NULL;
}
return (char *)new_mem;
}
void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size)
{
mem_free_align(mm_get_global(), (char *)mem - sizeof(size_t));
ram_limit_free(limit, size);
}

View File

@@ -18,39 +18,59 @@ scheduler_t *scheduler_get_current(void)
return &scheduler;
}
INIT_HIGH_HAD void scheduler_init(void)
void scheduler_init(void)
{
for (int i = 0; i < PRIO_MAX; i++)
{
slist_init(&scheduler.prio_list[i]);
}
}
void scheduler_add(scheduler_t *sched, sched_t *node)
INIT_HIGH_HAD(scheduler_init);
void scheduler_add(sched_t *node)
{
scheduler_t *sched = scheduler_get_current();
assert(node->prio >= 0);
assert(node->prio < PRIO_MAX);
if (node->prio != sched->max_prio)
{
sched->max_prio = node->prio;
}
slist_add(&sched->prio_list[node->prio], &node->node);
}
void scheduler_del(sched_t *node)
{
scheduler_t *sched = scheduler_get_current();
assert(node->prio >= 0);
assert(node->prio < PRIO_MAX);
slist_del(&node->node);
if (slist_is_empty(&sched->prio_list[node->prio]))
{
/*TODO:更新最大优先级,这里可以用位图优化*/
for (mword_t i = node->prio - 1; i >= 0; i--)
{
if (slist_is_empty(&sched->prio_list[i]))
{
sched->max_prio = i;
break;
}
}
}
}
sched_t *scheduler_next(sched_t *cur)
sched_t *scheduler_next(void)
{
scheduler_t *sche = scheduler_get_current();
sched_t *next_sch = NULL;
slist_head_t *next = NULL;
if (cur == NULL)
if (sche->cur_sche == NULL)
{
next = slist_first(&sche->prio_list[sche->max_prio]);
}
else
{
next = cur->node.next;
next = sche->cur_sche->node.next;
if (next == &sche->prio_list[sche->max_prio])
{
next = slist_first(&sche->prio_list[sche->max_prio]);

34
mkrtos_knl/knl/syscall.c Normal file
View File

@@ -0,0 +1,34 @@
#include "types.h"
#include "syscall.h"
#include "thread.h"
#include "task.h"
#include "obj_space.h"
#include "err.h"
int syscall_entry(entry_frame_t entry)
{
msg_tag_t tag = msg_tag_init3(0, 0, -1);
thread_t *th = thread_get_current();
task_t *tk = thread_get_current_task();
obj_map_entry_t *entry_obj =
obj_space_lookup(&tk->obj_space, entry.r[7]);
if (!entry_obj)
{
tag = msg_tag_init3(0, 0, -ENOENT);
return tag.raw;
}
if (!entry_obj->kobj.obj)
{
tag = msg_tag_init3(0, 0, -ENOENT);
return tag.raw;
}
kobject_t *kobj = obj_map_kobj_get(entry_obj->kobj.obj);
if (kobj->invoke_func)
{
kobj->invoke_func(kobj, NULL, &entry);
}
return tag.raw;
}

View File

@@ -39,7 +39,7 @@ void task_init(task_t *task, ram_limit_t *ram)
obj_space_init(&task->obj_space, ram);
}
static task_t *task_create(ram_limit_t *lim)
task_t *task_create(ram_limit_t *lim)
{
task_t *tk = mm_limit_alloc(lim, sizeof(task_t));
@@ -74,7 +74,8 @@ static kobject_t *task_create_func(ram_limit_t *lim, umword_t arg0, umword_t arg
* @brief 工厂注册函数 TODO:
*
*/
INIT_KOBJ void task_factory_register(void)
void task_factory_register(void)
{
factory_register(task_create_func, TASK_PROT);
}
INIT_KOBJ(task_factory_register);

View File

@@ -71,7 +71,7 @@ void thread_suspend(thread_t *th)
*/
void thread_sched(void)
{
sched_t *next_sche = scheduler_next(NULL);
sched_t *next_sche = scheduler_next();
if (next_sche == &thread_get_current()->sche)
{
@@ -87,7 +87,7 @@ void thread_sched(void)
void thread_ready(thread_t *th, bool_t is_sche)
{
assert(!slist_in_list(&th->sche.node));
scheduler_add(scheduler_get_current(), &th->sche);
scheduler_add(&th->sche);
th->status = THREAD_READY;
if (is_sche)
{
@@ -102,7 +102,7 @@ void thread_ready(thread_t *th, bool_t is_sche)
*/
thread_t *thread_create(ram_limit_t *ram)
{
thread_t *th = mm_limit_alloc(ram, THREAD_BLOCK_SIZE);
thread_t *th = mm_limit_alloc_align(ram, THREAD_BLOCK_SIZE, THREAD_BLOCK_SIZE);
if (!th)
{
@@ -138,10 +138,11 @@ static kobject_t *thread_create_func(ram_limit_t *lim, umword_t arg0, umword_t a
* @brief 工厂注册函数
*
*/
INIT_KOBJ void thread_factory_register(void)
void thread_factory_register(void)
{
factory_register(thread_create_func, THREAD_PROT);
}
INIT_KOBJ(thread_factory_register);
/**
* @brief 获取当前的task
*

View File

@@ -10,9 +10,14 @@
#include "types.h"
#include "thread.h"
#include "printk.h"
#include "thread_armv7m.h"
#include "app.h"
#include "mm_wrap.h"
#include "arch.h"
void get_syscall_handler(void)
syscall_entry_func syscall_handler_get(void)
{
return syscall_entry;
}
void thread_exit(void)
{
@@ -20,13 +25,18 @@ void thread_exit(void)
/*TODO:删除这个线程*/
}
void thread_to_user(void)
void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram)
{
pf_t *cur_pf = thread_get_current_pf();
pf_t *cur_pf = (pf_t *)user_sp - 1; // thread_get_pf(cur_th);
cur_pf->xpsr = 0x01000000L;
cur_pf->lr = (umword_t)thread_exit; //!< 线程退出时调用的函数
cur_pf->pc = (umword_t)pc | 0x1;
cur_pf->rg1[5] = (umword_t)ram;
arch_set_user_sp((umword_t)cur_pf);
thread_ready(thread_get_current(), TRUE);
cur_th->sp.knl_sp = (char *)cur_th + THREAD_BLOCK_SIZE;
cur_th->sp.user_sp = cur_pf;
cur_th->sp.sp_type = 1;
// arch_set_user_sp((umword_t)cur_pf);
// thread_ready(thread_get_current(), TRUE);
}

View File

@@ -15,7 +15,10 @@
#include "factory.h"
#include "globals.h"
#include "arch.h"
#include "map.h"
#include "app.h"
#include "mm_wrap.h"
#include "thread_armv7m.h"
static thread_t *knl_thread;
static task_t knl_task;
@@ -23,7 +26,7 @@ static task_t knl_task;
* 初始化内核线程
* 初始化内核任务
*/
INIT_STAGE1 static void knl_init_1(void)
static void knl_init_1(void)
{
thread_t *cur_th = thread_get_current();
@@ -31,17 +34,67 @@ INIT_STAGE1 static void knl_init_1(void)
task_init(&knl_task, &root_factory_get()->limit);
thread_bind(cur_th, &knl_task.kobj);
thread_ready(cur_th, FALSE);
}
INIT_STAGE1(knl_init_1);
/**
* 初始化init线程
* 初始化用户态任务
* 映射静态内核对象
* 运行init进程
*/
INIT_STAGE2 static void knl_init_2(void)
static void knl_init_2(void)
{
thread_t *init_thread = thread_create(&root_factory_get()->limit);
assert(init_thread);
task_t *init_task = task_create(&root_factory_get()->limit);
assert(init_task);
app_info_t *app = app_info_get((void *)(KNL_TEXT + INIT_OFFSET));
void *ram = mm_limit_alloc_align(&root_factory_get()->limit, app->i.ram_size, 8);
if (!ram)
{
printk("申请init进程内存失败.\n");
assert(ram);
}
void *sp_addr = (char *)ram + app->i.stack_offset - app->i.data_offset;
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;
thread_bind(init_thread, &init_task->kobj);
// thread_set_exc_regs(init_thread, KNL_TEXT + INIT_OFFSET);
thread_user_pf_set(init_thread, (void *)(KNL_TEXT + INIT_OFFSET), sp_addr_top, ram);
assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, THREAD_PROT));
assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, TASK_PROT));
for (int i = FACTORY_PORT_START; i < FACTORY_PORT_END; i++)
{
kobject_t *kobj = global_get_kobj(i);
if (kobj)
{
assert(obj_map_root(kobj, &init_task->obj_space, &root_factory_get()->limit, i));
}
}
thread_ready(init_thread, FALSE);
}
INIT_STAGE1(knl_init_2);
static void print_mkrtos_info(void)
{
const char *start_info[] = {
" _____ ______ ___ __ ________ _________ ________ ________ \r\n",
"|\\ _ \\ _ \\|\\ \\|\\ \\ |\\ __ \\|\\___ ___\\\\ __ \\|\\ ____\\ \r\n",
"\\ \\ \\\\\\__\\ \\ \\ \\ \\/ /|\\ \\ \\|\\ \\|___ \\ \\_\\ \\ \\|\\ \\ \\ \\___|_ \r\n",
" \\ \\ \\\\|__| \\ \\ \\ ___ \\ \\ _ _\\ \\ \\ \\ \\ \\ \\\\\\ \\ \\_____ \\ \r\n",
" \\ \\ \\ \\ \\ \\ \\ \\\\ \\ \\ \\ \\\\ \\| \\ \\ \\ \\ \\ \\\\\\ \\|____|\\ \\ \r\n",
" \\ \\__\\ \\ \\__\\ \\__\\\\ \\__\\ \\__\\\\ _\\ \\ \\__\\ \\ \\_______\\____\\_\\ \\ \r\n",
" \\|__| \\|__|\\|__| \\|__|\\|__|\\|__| \\|__| \\|_______|\\_________\\\r\n",
" \\|_________|\r\n",
"Complie Time:" __DATE__ " " __TIME__ "\r\n",
};
for (umword_t i = 0; i < sizeof(start_info) / sizeof(void *); i++)
{
printk(start_info[i]);
}
}
void start_kernel(void)
{
@@ -51,7 +104,7 @@ void start_kernel(void)
sys_call_init();
printk("mkrtos init done..\n");
printk("mkrtos running..\n");
thread_ready(thread_get_current(), FALSE);
print_mkrtos_info();
sti();
sys_startup();
thread_sched();

View File

@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13)
file(GLOB_RECURSE deps *.c)
add_library(lib OBJECT ${deps})
add_library(lib STATIC ${deps})
target_include_directories(
lib
PUBLIC

View File

@@ -832,7 +832,8 @@ static void xprintf_putc(int c)
{
uart_putc(uart_get_global(), c);
}
INIT_HIGH_HAD static void init_xprintf(void)
static void init_xprintf(void)
{
xdev_out(xprintf_putc);
}
}
INIT_HIGH_HAD(init_xprintf);

View File

@@ -2,7 +2,7 @@ ENTRY(Reset_Handler)
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K
FLASH (rx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 128K
FLASH (rx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 64K
}
SECTIONS
{

View File

@@ -9,7 +9,7 @@ MEMORY
RAM (xrw) : ORIGIN = KNL_DATA, LENGTH = KNL_DATA_SIZE
/* RAM1 (xrw) : ORIGIN = 0x68000000, LENGTH = 1M */
/* RAM2 (xrw) : ORIGIN = 0x2001C000, LENGTH = 16K */
FLASH (rx) : ORIGIN = KNL_TEXT + KNL_OFFSET, LENGTH = 128K
FLASH (rx) : ORIGIN = KNL_TEXT + KNL_OFFSET, LENGTH = 64K
}
/* Define output sections */

View File

@@ -1,4 +1,5 @@
cmake_minimum_required(VERSION 3.13)
add_subdirectory(server)
add_subdirectory(lib)

View File

@@ -1,10 +1,11 @@
cmake_minimum_required(VERSION 3.13)
set(CMAKE_C_FLAGS "${GLOBAL_C_FLAG} -w \
-fPIC -n -pie -fpie -fPIC -fpic -msingle-pic-base -mno-pic-data-is-text-relative \
-Wl,--gc-sections -Wall -g -D__dietlibc__ -D__arm__ -D__WORDSIZE=32\
" )
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \
-fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \
-Wl,--gc-sections -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \
" )
set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/dietlibc-0.34/arm/softfpu)
@@ -16,16 +17,22 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/dietlibc-0.34/include)
add_subdirectory(src)
add_library(diet
$<TARGET_OBJECTS:dietlibc_src>
$<TARGET_OBJECTS:dietlibc_arm>
$<TARGET_OBJECTS:dietlibc_lib>
$<TARGET_OBJECTS:dietlibc_libcompat>
$<TARGET_OBJECTS:dietlibc_libm>
$<TARGET_OBJECTS:dietlibc_libshell>
$<TARGET_OBJECTS:dietlibc_libstdio>
$<TARGET_OBJECTS:dietlibc_libugly>
$<TARGET_OBJECTS:dietlibc_profiling>
# $<TARGET_OBJECTS:dietlibc_softfpu>
$<TARGET_OBJECTS:dietlibc_builtins>
)
$<TARGET_OBJECTS:dietlibc_arm>
$<TARGET_OBJECTS:dietlibc_lib>
$<TARGET_OBJECTS:dietlibc_libcompat>
$<TARGET_OBJECTS:dietlibc_libm>
$<TARGET_OBJECTS:dietlibc_libshell>
$<TARGET_OBJECTS:dietlibc_libstdio>
$<TARGET_OBJECTS:dietlibc_libugly>
$<TARGET_OBJECTS:dietlibc_profiling>
# $<TARGET_OBJECTS:dietlibc_softfpu>
$<TARGET_OBJECTS:dietlibc_builtins>
)
target_link_libraries(diet
PUBLIC
dietlibc_src
)
add_dependencies(diet dietlibc_src)

View File

@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.13)
file(GLOB deps *.c *.S)
add_subdirectory(dietlibc-0.34)
add_library(dietlibc_src OBJECT ${deps})
add_library(dietlibc_src STATIC ${deps})
target_include_directories(
dietlibc_src
PUBLIC

View File

@@ -10,5 +10,5 @@ void __main(int *args, int start_addr)
__app_start_addr__ = start_addr;
ret = main(args[0], (char **)&args[1]);
exit(ret);
// exit(ret);
}

View File

@@ -1,4 +1,7 @@
#include "arm-features.h"
.syntax unified
.cpu cortex-m3
.thumb
FUNC_START __testandset
mov r2, r0

View File

View File

@@ -8,7 +8,7 @@ extern int __rel_end__;
/*
* @brief gbase ram<61>Ŀ<EFBFBD>ʼ<EFBFBD><CABC>ַ,tbase text<78>Ŀ<EFBFBD>ʼ<EFBFBD><CABC>ַ
*/
void reloc(unsigned int *gbase, unsigned int tbase)
void _reloc(unsigned int *gbase, unsigned int tbase)
{
int i;
unsigned int s;

View File

@@ -1,6 +1,7 @@
.syntax unified
.section .first, #execinstr
.globl reloc
.align 2
.globl _start_
.type _start_, %function
@@ -81,13 +82,13 @@ LoopInitStack:
mov r0, r12
push {r0, r4}
ldr r0, = __stack_end__
mov sp, r0
//ldr r0, = __stack_end__
//mov sp, r0
mov r0, r9
adr r1, _start_
bic r1, r1, #1
bl reloc
bl _reloc
pop {r0, r12}
adr r1, _start_

View File

@@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.13)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \
-fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \
-Wl,--gc-sections -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \
" )
set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS})
add_subdirectory(src)
file(GLOB deps *.c *.S)
add_library(
sys
STATIC
${deps}
)
target_link_directories(
sys
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}/src/dietlibc-0.34/include
)
target_link_libraries(
sys
PUBLIC
diet
)
add_dependencies(sys diet)

View File

@@ -0,0 +1,3 @@
#pragma once
#include <stdint.h>

View File

@@ -0,0 +1,2 @@
#include <stdint.h>

View File

@@ -0,0 +1,2 @@
#include <stdint.h>

View File

@@ -1,9 +1,11 @@
cmake_minimum_required(VERSION 3.13)
set(CMAKE_C_FLAGS "${GLOBAL_C_FLAG} -fPIC -n -pie -fpie -fpic \
-msingle-pic-base -mno-pic-data-is-text-relative --specs=nosys.specs \
-fmessage-length=0 -Wall -Xlinker --cref \
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \
-fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \
-Wl,--gc-sections -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \
")
set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS})
add_subdirectory(init)

View File

@@ -9,6 +9,7 @@ target_link_libraries(init.elf
PUBLIC
diet
)
add_dependencies(init.elf diet)
set_target_properties(init.elf PROPERTIES LINK_FLAGS
"-T ${CMAKE_CURRENT_SOURCE_DIR}/link.lds")

View File

@@ -0,0 +1,17 @@
#define HEAP_SIZE 1024 * 2
#define STACK_SIZE 1024 * 1
#if defined(__CC_ARM)
#define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init))
#define STACK_ATTR SECTION("STACK") __attribute__((zero_init))
#elif defined(__GNUC__)
#define HEAP_ATTR
#define STACK_ATTR
#elif defined(__IAR_SYSTEMS_ICC__)
#define HEAP_ATTR
#define STACK_ATTR
#endif
__attribute__((used)) HEAP_ATTR static char heap[HEAP_SIZE];
__attribute__((used)) STACK_ATTR static char stack[STACK_SIZE];

View File

@@ -1,5 +1,25 @@
int syscall(int nr, ...);
#define uint32_t unsigned int
typedef union msg_tag
{
uint32_t raw;
union
{
uint32_t type : 4;
uint32_t type2 : 6;
uint32_t prot : (sizeof(uint32_t) * 8) - 12;
};
} msg_tag_t;
#define msg_tag_init(r) \
((msg_tag_t){.raw = (r)})
#define msg_tag_init3(t, t2, p) \
msg_tag_init(((uint32_t)(t)&0xf) | (((uint32_t)(t2)&0x3f) << 4) | (((uint32_t)(p)) << 10))
int main(int argc, char *args[])
{
syscall(4, msg_tag_init3(0, 1, 4).raw, 'a', 2, 3, 4, 5);
return 0;
}

View File

@@ -0,0 +1,19 @@
.syntax unified
.text
/*
int syscall(int nr, ...)
*/
.global syscall
.type syscall, %function
syscall:
push {r4-r7}
mov r7, r0
mov r0, r1
mov r1, r2
mov r2, r3
add r6, sp,#16
ldmia r6,{r3-r5}
svc 128
pop {r4-r7}
bx lr

View File

@@ -1,4 +1,4 @@
set(CMAKE_TOOLCHAIN_PATH "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/" CACHE STRING " " FORCE)
set(CMAKE_TOOLCHAIN_PATH "/home/zhangzheng/gcc-arm-none-eabi-4_9-2014q4/bin/" CACHE STRING " " FORCE)
set(CROSS_COMPILE ${CMAKE_TOOLCHAIN_PATH}arm-none-eabi- CACHE PATH "" FORCE)
set(CMAKE_INSTALL_PATH "${CMAKE_BINARY_DIR}deploy" CACHE PATH "" FORCE)
@@ -16,10 +16,9 @@ set(CMAKE_NM "${CROSS_COMPILE}nm" CACHE PATH "" FORCE)
set(CMAKE_AR "${CROSS_COMPILE}ar" CACHE PATH "" FORCE)
set(CMAKE_SIZE "${CROSS_COMPILE}size" CACHE PATH "" FORCE)
set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m3-ldrd -O0 -g -std=gnu11 \
-fmessage-length=0 -Xlinker --print-map -Wall -W -fno-stack-protector -g \
-mfloat-abi=soft -lc -lrdimon -u _printf_float \
-ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker -Wl,-gc-sections \
set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g -mfloat-abi=soft -lc -lrdimon \
-u _printf_float -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \
-nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker --gc-sections -fno-stack-protector \
" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m3-ldrd -O0 -g -std=c++11 \
@@ -28,9 +27,9 @@ set(CMAKE_CXX_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m
-ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker -Wl,-gc-sections \
" CACHE STRING "" FORCE)
set(CMAKE_ASM_FLAGS "-mcpu=cortex-m3 -mthumb -mno-thumb-interwork -mfix-cortex-m3-ldrd -O0 -g -std=gnu11 \
-mfloat-abi=soft -lc -lrdimon -u _printf_float \
-ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker --gc-sections \
set(CMAKE_ASM_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g -mfloat-abi=soft -lc -lrdimon \
-u _printf_float -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \
-nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker --gc-sections -fno-stack-protector \
" CACHE STRING "" FORCE)
set(CMAKE_C_LINK_EXECUTABLE "${CMAKE_LINKER} <OBJECTS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> --start-group <LINK_LIBRARIES> --end-group -o <TARGET>" CACHE INTERNAL " " FORCE)