### 拷贝系统文件<br>
**System**：CosyOS的内核文件。<br>
**Config**：CosyOS的配置文件，包括系统配置文件和MCU配置文件。<br>
**Hook**：CosyOS已经为用户创建好了六个系统钩子函数，分别位于各自同名的C文件中，用户直接写代码即可。<br>
拷贝上述三个文件夹及其下属文件至您的工程文件夹。<br>

### 添加Group和文件<br>
打开工程，添加三个Group，分别命名为System、Config、Hook，再分别添加同名文件夹下的所有文件至各个Group。<br>
Config组可以添加所有文件，也可有选择的添加文件。首先添加syscfg.h，再添加相应的MCU配置文件。<br>
如您使用的是51单片机，应添加mcucfg_8051.c和mcucfg_8051.h；<br>
如您使用的是Cortex-M内核，应添加mcucfg_cmx.c和mcucfg_cmx.h。<br>
![输入图片说明](../images/KFLC_group_1.png)<br>
![输入图片说明](../images/KFLC_group_2.png)<br>

### 配置工程<br>
#### 8051内核

一、使用LX51扩展链接器<br>
![输入图片说明](../images/KFLC_8051_1.png)<br>

二、内存模型<br>
内存模型仅支持Large，不要选择其它。如果您的变量希望定义在其它内存，可在定义时指定存储域。<br>
![输入图片说明](../images/KFLC_8051_2.png)<br>

三、优化级别<br>
可选级别：4~8级<br>
推荐级别：8级（default）<br>
CosyOS支持高等级优化，您完全可以选择8级（default），speed偏向于代码执行效率，size偏向于减少代码量。<br>
最低不能低于4级（必须启用寄存器变量优化），最高不能高于8级。即使代码放不下，您也不能把优化级别<br>
设置为9级或以上，可通过删减代码或增大flash来解决。<br>
![输入图片说明](../images/KFLC_8051_3.png)<br>

四、不覆盖/可重入/移除未使用<br>
1、LX51 Misc标签页，添加控制命令“NOOVERLAY”，以禁用数据覆盖。<br>
![输入图片说明](../images/KFLC_8051_4.png)<br>
2、由于CosyOS for 8051在设计上已摒弃了传统的可重入栈【IBP/PBP/XBP】，所以对于不可重入的库函数或自定义函数，<br>
如需要可重入，用户可复制相同的副本（函数）再分别调用，或采用二值信号量、互斥信号量（当仅存在任务中调用时）等方式来实现互斥访问。<br>
3、为减少代码量，用户应手动移除未使用的变量、函数或C文件，因为“NOOVERLAY”会导致“REMOVEUNUSED”失效。<br>

#### 80251内核

一、Target标签页<br>
CPU模式仅支持Source（251 native）。<br>
内存模型支持Small、XSmall、Large。<br>
Code Rom Size支持Large、Huge。Huge模式时，需用户自行配置Exeternal Memory。<br>
推荐勾选 4 Byte Interrupt Frame Size。<br>
![输入图片说明](../images/KFLC_80251_1.png)<br>
![输入图片说明](../images/KFLC_80251_2.png)<br>

二、HEX Format<br>
Code Rom Size为Huge时，仅支持HEX-386格式。<br>
![输入图片说明](../images/KFLC_80251_3.png)<br>

三、优化级别<br>
可选级别：3~7级<br>
推荐级别：7级（default）<br>
CosyOS支持高等级优化，您完全可以选择7级（default），speed偏向于代码执行效率，size偏向于减少代码量。<br>
最低不能低于3级（必须启用寄存器变量优化），最高不能高于7级。即使代码放不下，您也不能把优化级别<br>
设置为8级或以上，可通过删减代码或增大flash来解决。<br>
![输入图片说明](../images/KFLC_80251_4.png)<br>

四、不覆盖/可重入/移除未使用<br>

方案一、“Generate reentrant functions” + “REMOVEUNUSED”<br>
1、C251标签页，“Generate reentrant functions”打勾，以生成全局可重入函数。<br>
![输入图片说明](../images/KFLC_80251_5.png)<br>
2、L251 Misc标签页，添加控制命令“REMOVEUNUSED”，以自动移除未使用的代码段和数据段。<br>
![输入图片说明](../images/KFLC_80251_6.png)<br>

方案二、“NOOVERLAY” + “reentrant” + “手动移除未使用”<br>
1、C251标签页，“Generate reentrant functions”不可打勾。<br>
2、L251 Misc标签页，添加控制命令“NOOVERLAY”，以禁用数据覆盖。<br>
![输入图片说明](../images/KFLC_80251_7.png)<br>
3、用户的自定义函数如需要可重入，应手动添加“reentrant”属性。<br>

```c
void function_x(void) reentrant;
void function_x(void) reentrant
{
    ;
}
```

4、为减少代码量，用户应手动移除未使用的变量、函数或C文件，因为“NOOVERLAY”会导致“REMOVEUNUSED”失效。<br>

方案一 PK 方案二<br>
1、方案一为智能方案，所有函数都将成为可重入函数，并自动移除未使用的代码段和数据段。<br>
2、方案二为性能方案，性能上优于方案一，但需要用户明确哪些函数需要可重入并声明，并手动移除未使用的代码段和数据段。<br>
3、方案一相较方案二，需配置更大的任务栈，对edata内存的需求将明显增加。<br>
4、如果启用私信功能，您仅能采用方案二。<br>

五、内嵌汇编<br>
System\os_handler.c应设置内嵌汇编。<br>
![输入图片说明](../images/KFLC_80251_8.png)<br>
![输入图片说明](../images/KFLC_80251_9.png)<br>

#### Arm内核

一、Target标签页<br>
使用微库还是标准库与CosyOS无关。<br>
如果MCU有硬件浮点运算单元并且您需要使用它，仅需在此开启选项即可。<br>
![输入图片说明](../images/KFLC_Arm_1.png)<br>

二、C/C++标签页<br>
优化级别：CosyOS支持高等级优化，您完全可以选择O2级（default），但不推荐您选择O3级。<br>
C99模式：为可选项，建议勾选。<br>
GNU扩展：为必选项，如不勾选，CosyOS将无法正常使用。<br>
如选项中没有“GNU extensions”，可在下方的“Misc Controls”中添加“--GNU”来启用。<br>
![输入图片说明](../images/KFLC_Arm_2.png)<br>

### 系统配置<br>
打开Config\syscfg.h，这里是CosyOS的系统配置，各项设置均有详细的说明，在keil下可使用图形用户界面Configuration Wizard进行配置，如出现乱码，将文件的编码格式转换为ANSI即可解决。<br>
![输入图片说明](../images/syscfg.png)

### MCU配置<br>
MCU配置分为用户定义和系统定义，用户定义是需要用户配置的，各项设置均有详细的说明，在keil下可使用图形用户界面Configuration Wizard进行配置，如出现乱码，将文件的编码格式转换为ANSI即可解决。<br>

#### 8051内核
![输入图片说明](../images/mcucfg_8051.png)<br>

#### 80251内核
![输入图片说明](../images/mcucfg_80251.png)<br>

#### Cortex-M内核
![输入图片说明](../images/mcucfg_cmx.png)<br>

### 堆栈配置<br>
#### 栈（STACK）
所有内核，栈需要用户自行在启动文件中配置。<br>
#### 堆（HEAP）
Arm内核，堆需要用户自行在启动文件中配置。<br>
8051内核、80251内核，没有堆的概念，与之相应的是内存池，用户需在MCU配置文件中配置。<br>
#### 可重入栈（reentrant stack）
1、8051内核，所有系统服务均不使用可重入栈[IBP/PBP/XBP]，也不允许用户使用可重入栈，无需用户配置。<br>
2、80251内核，只有中断同步服务“接收邮件”需要使用可重入栈，且系统已经配置好了，无需用户配置。<br>
3、Arm内核，栈就是可重入栈，无需用户配置。<br>

### 链接文件<br>
用户在自己的各个C文件中需包含系统链接头文件os_link.h。<br>

```c
#include "..\System\os_link.h"
```

### 系统初始化
初始化寄存器、GPIO、中断等工作，需在初始化钩子中执行。<br>

### 创建任务
任务线程的创建，支持的API包括如下：<br>
1、创建一般任务：uCreateTask(task, tpl, tss, srt, ndm)<br>
2、创建定时中断任务：uCreateTask_TimInt(tmid, arl, task, tpl, tss, srt, ndm)<br>
3、创建定时查询任务：uCreateTask_TimQry(tmid, event, arl, task, tpl, tss, srt, ndm)<br>
详情请参阅《CosyOS-API用户参考手册》中的相关说明及示例代码。<br>

### 启动任务
需在启动钩子中启动用户任务，支持的API包括如下：<br>
1、启动任务：uStartTask(task, state)<br>
2、启动任务并就绪：uStartTask_Ready(task)<br>
3、启动任务并挂起：uStartTask_Suspend(task)<br>
详情请参阅《CosyOS-API用户参考手册》中的相关说明及示例代码。<br>
注意：所有系统任务、定时中断任务、定时查询任务均由CosyOS自动启动，无需用户启动。<br>

**_接下来，就让我们开始CosyOS之旅吧！_**  :star:  :star:  :star:  :star:  :star:  
