# 启动范例

由于笔者已经完成针对 ARM Cortex M0/3/4 系列单品机的底层汇编代码,使用该系列单片机的用户无需关心这些代码的实现,如果使用 M7 或其他系列的单片机,只需要根据 ARM 的官方文档对个别汇编指令做简单的修改即可。若用户使用的是非 ARM Cortex Mx 系列的单片机,则需要参考笔者的代码实现底层汇编代码,这些代码包含在 MadArchC.c、MadArchS.s 中。

# 代码示例

#include "MadOS.h"      // 此头文件中即包含所有 MadOS 提供的功能。
#include "UserConfig.h" // 于此头文件中定义线程优先级、中断优先级等各种参数。

MadAligned_t MadStack[ MAD_OS_STACK_SIZE / MAD_MEM_ALIGN ] = { 0 };
// MAD_OS_STACK_SIZE 为堆栈尺寸(以字节为单位);
// 用 MadAligned_t 定义堆栈可使其 n 字节对齐;
// ARM CM 平台,为输出浮点数(printf),需使地址 8 字节对齐,MadAligned_t 即 MadU64。

static void madStartup(MadVptr exData);
static void madSysRunning(MadVptr exData);

int main()
{
    // { 必要的硬件初始化 }
    madCopyVectorTab();  // 将中断向量从 Flash 复制到 RAM 中
    madOSInit(MadStack, MAD_OS_STACK_SIZE);
    madThreadCreate(madStartup, 0, MAD_OS_STACK_SIZE / 2, 0);
    madOSRun();
    while(1);
}

static void madStartup(MadVptr exData)
{
    (void)exData;
    madInitSysTick(DEF_SYS_TICK_FREQ, DEF_TICKS_PER_SEC);
#if MAD_STATIST_STK_SIZE
    madInitStatist();
#endif
    // { 建立用户线程 }
    madThreadCreate(madSysRunning, 0, 96, THREAD_PRIO_SYS_RUNNING);
    madMemChangeOwner(MAD_THREAD_SELF, MAD_THREAD_RESERVED);
    madThreadDelete(MAD_THREAD_SELF);
}

static void madSysRunning(MadVptr exData)
{
    // { ... }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 启动思路

  • [必须] 必要的硬件初始化;
  • [必须] MadOS 初始化;
  • [必须] 建立启动线程,使其堆栈空间占用整个内存堆空间的前半部分。
  • [必须] 在启动线程中:
    • [必须] System Tick 的初始化;
    • [可选] 统计线程的初始化;
    • [必须] 建立用户线程;
    • [可选] 建立系统运行标识线程。一般,该线程仅周期性的驱动一个 LED 闪烁;
    • [必须] 将启动线程的全局资源设置为<保留>;
    • [必须] 将启动线程本身删除。

TIP

启动线程删除后内存堆的前半部分被回收,再次需要动态内存即可紧贴内存堆头分配。