510
个编辑
更改
→sys_init.c
=== gui_os.c ===
gui_os.c文件,此文件将与具体的操作系统有关,在基础实验的Display和GUI中是没有的,所以这边给大家讲解一下。在不同的操作系统中,开发者要根据操作系统要求完成对GUI_Lockc文件,此文件将与具体的操作系统有关,在基础实验的Display和GUI中是没有的,所以这边给大家讲解一下。 在不同的操作系统中,开发者要根据操作系统要求完成对GUI_Lock,GUI_Unlock,GUIOS_Init函数进行修改。开发者只要完成信号量Semaphore或临界区即可。
永久阻塞模式申请信号量,用于阻塞有关显示屏GUI打印的信号量。<syntaxhighlight lang="c++" line="1" start="32">
== 实验02-led点灯 ==
led点灯实验,我们在实验01的基础上,新增了使用LiteOS去创建一个独立的led task任务进程。
通过这个实验,大家需要掌握的是LiteOS Task任务的创建和使用。
=== 实验验证 ===
=== 源码详解 ===
=== main.c ===
在硬件初始化函数中,我们新增了LED硬件初始化部分。<syntaxhighlight lang="c++" line="1" start="27">
void HardWare_Init(void)
{
// 初始化LCD
BSP_EvbLcdInit();
// 初始化LED
BSP_EvbLedInit();
}
</syntaxhighlight>在LiteOS 独立任务初始化函数中,我们新增加了LED独立任务。<syntaxhighlight lang="c++" line="1" start="44">
void LosTask_Init(void)
{
// 初始化图形接口
GUI_Init();
GUI_DispString("LiteOS");
GUI_DispNextLine();
GUI_DispString("Led Test");
// 初始化LED任务
LOS_BoardLedEntry();
}
</syntaxhighlight>
=== los_bsp_led.c ===
初始化LED硬件,文件中函数功能等同于LED基础实验中的gyu_led.c,不清楚的大家可以查看基础实验中的说明。
=== los_led_entry.c ===
此文件为本实验的重点内容,也就是我们使用LiteOS创建的独立LED控制任务。
基于los的LED独立任务创建函数,在创建一个task任务时,我们需要做如下步骤:
1.使用TSK_INIT_PARAM_S结构体定义一个创建task任务的参数结构
2.清空任务参数内容
3.定义此任务的入口功能(用户任务处理的功能函数)
4.分配任务栈的大小,默认给LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE大小
5.给当前任务取一个名称,此任务我们取名“LED-Demo”
6.分配优先级,任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31<syntaxhighlight lang="c++" line="1" start="43">
void LOS_BoardLedEntry(void)
{
UINT32 uwRet;
// 定义用于创建任务的参数的结构
TSK_INIT_PARAM_S stTaskInitParam;
(VOID)memset((void *)(&stTaskInitParam), 0, sizeof(TSK_INIT_PARAM_S)); // 任务参数清空
stTaskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)LOS_BoardLedTskfunc; // 定义此任务的入口功能
stTaskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE; // 任务栈大小0x500
stTaskInitParam.pcName = "LED-Demo"; // 任务名称
stTaskInitParam.usTaskPrio = 10; // 任务优先级
uwRet = LOS_TaskCreate(&g_uwLedTaskID, &stTaskInitParam); // 创建此任务
if (uwRet != LOS_OK)
{
return;
}
return;
}
</syntaxhighlight><syntaxhighlight lang="c++" line="1" start="72">
static LITE_OS_SEC_TEXT VOID LOS_BoardLedTskfunc(VOID)
{
while (1)
{
// 点亮LED,LCD打印"LED=ON",延时500ms
BSP_EvbLedControl(LED_ON);
GUI_DispStringAtCL("LED=ON",10,32,GUI_Context.colorInfo.bkColor);
(void)LOS_TaskDelay(500);
// 熄灭LED,LCD打印"LED=OFF",延时500ms
BSP_EvbLedControl(LED_OFF);
GUI_DispStringAtCL("LED=OFF",10,32,GUI_Context.colorInfo.bkColor);
(void)LOS_TaskDelay(500);
}
}
</syntaxhighlight>