文章

jdos文档

jdos介绍

jdos是一个简单的操作系统,实现了内存管理、任务管理、定时管理和异常管理。

jdos通过简单的设计,为嵌入式系统提供了一个轻量级的实时操作系统解决方案。

仓库地址: https://gitee.com/jiang-xiaojian/jdos

任务管理

jdos的任务管理是jdos的基础,任务调度策略是基于优先级的抢占式调度策略,支持256个优先级(-128 ~ 127),数字越小,优先级越高,一般从0级开始使用,最低优先级被空闲任务使用。高优先级任务可以打断低优先级任务,同级任务与低优先级任务不可打断正在运行的同级任务与高优先级任务。

jdos中的任务通过两个链表进行管理,分别是就绪链表和延时链表,没在任务链表中的任务属于在任务池中。

就绪链表中,第一个任务总是执行状态或者是即将运行的任务,且优先级总是为最高。只有当就绪链表中的任务已经改变或当前正在执行的任务让出CPU才会进行任务切换,当前任务进入延时状态即可让出CPU使用权,或者系统时钟来临时,系统总是切换为就绪链表中的第一任务,如果就绪链表已经改变,系统将会进行上下文切换,当前任务让出CPU使用权。

延时链表中,第一个任务的延时时间总是最低,当系统时钟来临时,系统检查延时链表,延时完成的任务通过优先级策略将其加入到就绪链表中。

任务池中的任务等待被执行,可以将其加入就绪链表直接运行,也可以将其启动为定时任务。当一个任务没有进行系统自动回收设置并执行完成后,系统将会把任务放回任务池。

任务状态

在jdos中任务有以下几种状态

  1. 就绪,即将被执行的任务

  2. 运行,正在运行的任务

  3. 延时,正在延时的任务

  4. 暂停,等待运行的任务

任务创建

jdos的任务创建非常简单,只需要很少的操作就可以成功创建一个任务并运行起来:

//任务栈大小
#define TASK_STACK_SIZE 512
//任务优先级
#define TASK_PRI 1
//任务函数
void task1()
{
	while (1)
	{
		jd_delay(100);
	};
}
//定义任务控制块
jd_task_t *jd_task_test;
//main
void jd_main
{
	//创建任务
	jd_task_test = jd_task_create(task1, TASK_STACK_SIZE, TASK_PRI);
	if (jd_task_test != JD_NULL)
		//运行任务
		jd_task_run(jd_task_test);
	while(1);
}

定时管理

jdos的定时管理以任务管理为基础,当一个任务被创建后,可以使用定时管理启动,定时管理启动的任务可以分为两类,第一类为不循环任务,执行一次后放回任务池,第二类为循环任务,启动后将会按照设置的时间循环运行。

任务定时启动

jdos的定时任务启动也非常简单,只需要在任务创建后用定时器启动就可以进行运行:

//任务栈大小
#define TASK_STACK_SIZE 512
//任务优先级
#define TASK_PRI 1
//任务函数
void task1()
{
	while (1)
	{
		jd_delay(100);
	};
}
//定义任务控制块
jd_task_t *jd_task_test;
//main
void jd_main
{
	//创建任务
	jd_task_test = jd_task_create(task1, TASK_STACK_SIZE, TASK_PRI);
	if (jd_task_test != JD_NULL)
		//启动定时任务,不循环,200ms后执行
		jd_timer_start(test_task1, 200, JD_TIMER_NOLOOP);
	while(1);
}

内存管理

jdos支持内存池动态管理,系统启动时将会划分一大块内存进行管理,这块内存的大小可自由定义,当任务正在被创建时或者用户申请使用,系统将会在内存池中寻找一块大小合适的内存进行划分,当内存池中没有足够的大小的内存时,将会返回空,当手动释放内存时,系统将会回收删除任务的内存,如果释放内存周围有没有被使用的内存时,内存将会被合并。

异常管理

jdos接管了内核的systick、pendsv和svc异常,用于实现jdos的功能。

License:  CC BY 4.0