#include "rtthread_start.h"
#include "board.h"


//======================================================================
//函数名称：OS_start
//函数参数：(*func)(void):主线程回调函数
//函数返回：无
//功能概要：系统启动函数
//======================================================================
void OS_start(void (*func)(void))
{
//	setVector(SVCall_IRQn,(uint32_t)&SVC_Handler);  //重定向SVC中断
	//启动操作系统
	//           主线程           主线程函数
	rtthread_start(func);
}


//======================================================================
//函数名称：rtthread_start
//函数返回：无
//参数说明：主线程首址（传址，作为输出参数）；func：主线程函数指针
//         （作为输入参数)
//功能概要：启动rtthread，设置堆栈区，初始化Systick、定时器、调度器，创建主线程、空闲线程，启动调度器
//======================================================================
void rtthread_start(void (*func)(void))
{
	//（1）关总中断
	rt_hw_interrupt_disable();

	//（2）板级初始化，内部包括堆空间初始化
	rt_hw_board_init();

	//（3）系统定时器初始化
	rt_system_timer_init();

	//（4）系统调度器初始化
	rt_system_scheduler_init();

	//（5）创建主线程
	rt_thread_t thd_main;
#ifdef RT_USING_HEAP
	thd_main = rt_thread_create("main", (void *)func, RT_NULL, 512, 10, 20);
    RT_ASSERT(tid != RT_NULL);
#else
    rt_err_t result;
	uint8_t main_stack[512];
    thd_main = &main_thread;
    result = rt_thread_init(thd_main, "main", func, RT_NULL,
                            main_stack, sizeof(main_stack), 10, 20);
    RT_ASSERT(result == RT_EOK);

    (void)result;
#endif
    rt_thread_startup(thd_main);

	//（6）创建空闲线程
	rt_thread_idle_init();

	//（7）启动调度器
	rt_system_scheduler_start();

}
