support application.
This commit is contained in:
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@@ -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": [
|
||||
|
||||
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
31
mkrtos_knl/inc/knl/app.h
Normal 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);
|
||||
@@ -1,3 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#define SYS_SCHE_HZ 1000 //!< 系统调度频率
|
||||
#define SYS_SCHE_HZ 100 //!< 系统调度频率
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
3
mkrtos_knl/inc/knl/thread_armv7m.h
Normal file
3
mkrtos_knl/inc/knl/thread_armv7m.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram);
|
||||
@@ -25,3 +25,5 @@
|
||||
|
||||
#define container_of(ptr, type, member) \
|
||||
((type *)(((umword_t)(ptr)) - ((umword_t)(&(((type *)0)->member)))))
|
||||
|
||||
#define USED __attribute__((used))
|
||||
|
||||
@@ -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
7
mkrtos_knl/knl/app.c
Normal file
@@ -0,0 +1,7 @@
|
||||
#include "types.h"
|
||||
#include "app.h"
|
||||
|
||||
app_info_t *app_info_get(void *addr)
|
||||
{
|
||||
return (app_info_t *)addr;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
34
mkrtos_knl/knl/syscall.c
Normal 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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
|
||||
add_subdirectory(server)
|
||||
add_subdirectory(lib)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#include "arm-features.h"
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.thumb
|
||||
|
||||
FUNC_START __testandset
|
||||
mov r2, r0
|
||||
|
||||
0
mkrtos_user/lib/dietlibc/src/dummy.c
Normal file
0
mkrtos_user/lib/dietlibc/src/dummy.c
Normal 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;
|
||||
|
||||
@@ -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_
|
||||
|
||||
31
mkrtos_user/lib/sys/CMakeLists.txt
Normal file
31
mkrtos_user/lib/sys/CMakeLists.txt
Normal 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)
|
||||
|
||||
|
||||
3
mkrtos_user/lib/sys/inc/u_prot.h
Normal file
3
mkrtos_user/lib/sys/inc/u_prot.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
2
mkrtos_user/lib/sys/src/u_factory.c
Normal file
2
mkrtos_user/lib/sys/src/u_factory.c
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
#include <stdint.h>
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
17
mkrtos_user/server/init/src/heap_stack.c
Normal file
17
mkrtos_user/server/init/src/heap_stack.c
Normal 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];
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
19
mkrtos_user/server/init/src/syscall.S
Normal file
19
mkrtos_user/server/init/src/syscall.S
Normal 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
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user