LiteOS,比较熟悉了,出来很久了,真正接触它是在Hi3559v200运动相机上,跑着LiteOS + Linux双系。在学习了解时,希望按照自己的风格来,于是边了解边结构。
但毕竟没有全开源,所以对于底层的调度等都无法看到代码,只能望着libcortex-a7.a而惆怅。
处于对系统调度算法及SMP的好奇,搜索到RT-Thread是全开源的,于是下载研究,并在HI3518EV300上边学边写。了解了后,原来是那么简单,有点类似单片机,开个定时器,到时间了就调度。虽说简单,但设计上要考虑的东西还是挺多了,由于时间原因,只学习到优先级调度,同级时间轮转调度,完成了几个测试任务的打印输出。
/*
* Future Kernel Bootloader
*
* Copyright (c) 2020 FineClass <fineclass@163.com>
*
* LOC: main.c
* ************************************************ */
#include <board.h>
#include <config.h>
#include <rtsi.h>
#define RTS_MAIN_THREAD_PRIORITY (RTS_PRIORITY_MAX / 3)
/* the system main thread */
static void main_thread(void *param)
{
#ifdef RTS_USING_SMP
rt_hw_secondary_cpu_up();
#endif
while(1) {
RTS_ThreadId tid = RTS_thread_self_id();
kprint("MainThread(id: %u) run\n", tid);
nop_delay(1000);
}
}
static void test_thread(void *param)
{
while(1) {
RTS_ThreadId tid = RTS_thread_self_id();
kprint("TestThread(id: %u) run\n", tid);
nop_delay(1000);
}
}
void boot_main(u32 base)
{
u32 ret = 0;
RTS_ThreadId mainTid = RTS_THREAD_ID_INVAILD;
RTS_hw_interrupt_disable();
kprint("Fukeboot v%u.%u.%u (Build %s %s)\n",
MAJOR, MINOR, PATCH, __DATE__, __TIME__);
RTS_init(base, DDR_BASE + DDR_SIZE - base);
// create app_thread
ret = RTS_thread_create(&mainTid, "MainThread", main_thread,
NULL, RTS_MAIN_THREAD_PRIORITY);
if(ret != RTS_RESULT_OK) {
kprint("create MainThread err(0x%08X)\n", ret);
} else {
kprint("create MainThread (id: %u) OK\n", mainTid);
}
// create test_thread
ret = RTS_thread_create(&mainTid, "TestThread", test_thread,
NULL, RTS_MAIN_THREAD_PRIORITY);
if(ret != RTS_RESULT_OK) {
kprint("create TestThread err(0x%08X)\n", ret);
} else {
kprint("create TestThread (id: %u) OK\n", mainTid);
}
// then