摘要:本文简单介绍OpenHarmony轻量系统移植,内核初始化和启动
适合群体:想自己动手移植OpenHarmony轻量系统的朋友
上一节我们已经实现了链接脚本和启动文件,现在代码可以进入main函数,接下来我们要初始化内核、启动内核。
6.1 main函数Main函数位于:deviceboardlianzhiangd32f303_lianzhiansdk
![](https://harmonyos.oss-cn-beijing.aliyuncs.com/images/202202/19f3aa4309eaccd53d351731c4a958eb659122.png?x-oss-process=image/resize,w_489,h_476)
可以看到,main函数的实现比较简单,先实现gpio和串口的初始化。
接下来是比较重要的,我们要调用内核之前,需要先调用LOS_KernelInit做内核初始化。
然后我们可以先创建自己的线程,这里我写了一个 TaskSample 函数,该函数用于创建2个线程:
- VOID TaskSampleEntry2(VOID)
- {
- printf("______>>>>>>>>> %s %drn", __FILE__, __LINE__);
- led_init();
- while (1) {
- printf("___>>>>>> %s %drn", __FILE__, __LINE__);
-
- led_on(0);
- led_on(1);
- led_on(2);
- led_on(3);
- LOS_TaskDelay(1000);
-
- led_off(0);
- led_off(1);
- led_off(2);
- led_off(3);
- LOS_TaskDelay(1000);
- }
- }
- //线程1,用于打印
- VOID TaskSampleEntry1(VOID)
- {
- printf("______>>>>>>>>> %s %drn", __FILE__, __LINE__);
- while (1) {
- printf("___>>>>>> %s %drn", __FILE__, __LINE__);
- LOS_TaskDelay(1000);
-
- }
- }
- //创建线程
- VOID TaskSample(VOID)
- {
- UINT32 uwRet;
- UINT32 taskID1;
- UINT32 taskID2;
- TSK_INIT_PARAM_S stTask = {0};
- stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry1;
- stTask.uwStackSize = 0x1000;
- stTask.pcName = "TaskSampleEntry1";
- stTask.usTaskPrio = 6; /* Os task priority is 6 */
- uwRet = LOS_TaskCreate(&taskID1, &stTask);
- if (uwRet != LOS_OK) {
- printf("Task1 create failedrn");
- }
- stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskSampleEntry2;
- stTask.uwStackSize = 0x1000;
- stTask.pcName = "TaskSampleEntry2";
- stTask.usTaskPrio = 7; /* Os task priority is 7 */
- uwRet = LOS_TaskCreate(&taskID2, &stTask);
- if (uwRet != LOS_OK) {
- printf("Task2 create failedrn");
- }
- }
复制代码
6.2 内核启动内核启动函数是LOS_Start();一般来说,该函数是不会返回的,调用该函数后内核启动,会执行各种任务。
![](https://harmonyos.oss-cn-beijing.aliyuncs.com/images/202202/58af06816b3ee19e282188e1194c3e36d78b0b.png?x-oss-process=image/resize,w_470,h_348)
其实这里我的main函数是非常简单的,通常情况下,我们需要创建一个线程,该线程去执行 OHOS_Main(); 函数。不过这里我们先做简单的,后面再完善。