使用1000行不到的代码实现一个完整的时时操作系统,包括任务调度,独立栈空间,内存管理,消息传递机制等等
软件架构
systick最小颗粒(inc/systick.h):
#define SYSTICK_RELOAD_VAL 71999 //1K 0.1K
内存管理
内存管理使用动态和静态两种方式进行管理,由链接文件指定其内存静态分配
链接配置(cm3/flash.ld)
MEMORY
{
RAM(rwx) : ORIGIN = 0x20000C00, LENGTH = 61K
FLASH (rx) : ORIGIN = 0x08005000, LENGTH = 492K
}
内存分为两部分,需要动态读写的ram(data、bss),只读内存flash(text),由于bootlaoder占用部分flash空间所以flash起始地址向后偏移20K,详细分配情况如下:
内存分配参考链接文件(cm3/flash.ld)
SECTIONS
{
.text :
{
. = ALIGN(0x4);
KEEP(start_up.o(.text))
KEEP(*(.text*))
KEEP(*(.rodata))
KEEP(*(.rodata*))
. = ALIGN(4);
_etext_end = . ;
_sidata = _etext_end ;
} > FLASH
.data : AT (_sidata)
{
. = ALIGN(0x4);
_sdata = . ;
KEEP(*(.data))
KEEP(*(.data*))
. = ALIGN(0x4);
_edata = . ;
} > RAM
.bss :
{
. = ALIGN(0x4);
_sbss = . ;
__bss_start__ = . ;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(0x4);
_ebss = . ;
__bss_end__ = . ;
_exit = . ;
} > RAM
.stack :
{
} > RAM
stack_top = 0x2000a000;
}