久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
自己摸了一個操作系統內核,發出來給大家看看。
[打印本頁]
作者:
Hui_Min
時間:
2020-7-28 09:24
標題:
自己摸了一個操作系統內核,發出來給大家看看。
溫馨提示: 1.該內核僅供學習和參考使用。
2.大概率不會再更新(沒必要造輪子)。
3.該內核并不成熟,如要使用操作系統請尋找市面上成熟的內核。 4.個人不喜歡大片的注釋,注釋僅僅說明大致功能,細節需自行理解。
#include <Task_Core.H>
#include <stdlib.h>
#include <Config.H>
void Free_Task();
struct Task_Control_Block_List{
uchar* head_Stack; //棧頭指針
uchar* tail_Stack; //棧尾指針
uchar* event_Pointer; //時間指針
uchar event_End; //時間結束
uchar ready; //就緒狀態
uchar priority; //優先級
struct Task_Control_Block_List* Next;
};
typedef struct Task_Control_Block_List Task_List;
struct Task_Priority_List{
struct Task_Priority_List * Next;
struct Task_Control_Block_List* Head_Task;
struct Task_Control_Block_List* Next_Task;
uchar priority;
}Task_Priority_List;
typedef struct Task_Priority_List Task_Ready_List;
//添加任務到優先級鏈
void ADD_Task_To_Priority_List(Task_List * list);
//從優先級鏈中刪除任務
void DEC_Task_Of_Priority_List(Task_List * list);
static Task_List Block_List_Head; // 阻塞鏈表表頭
static Task_List* Now_Task; // 目前啟用任務
static Task_Ready_List Task_Ready_List_Head;// 優先級鏈表表頭
static uchar data Stack_Start; // 棧開始
static uchar data Stack_Last; // 上一個棧尾
static uchar data Stack_St; // 中間變量
//任務調度函數
#pragma asm
CSEG AT 0000BH
LJMP Timer
#pragma endasm
void Timer() interrupt 1
{
Task_List* Task_Now;
Task_List* Task_Now1;
uchar* stack;
uchar a;
int i;
//禁止中斷嵌套
EA = 0;
//保存上文
#pragma asm
MOV Stack_Last,SP
MOV SP, Stack_St
#pragma endasm
Now_Task->tail_Stack =(uchar *) Stack_Last;
// 搜索阻塞鏈表中達成條件的任務
for(Task_Now = &Block_List_Head; Task_Now->Next != NULL;)
{
if(Task_Now->Next->event_Pointer[0] >= Task_Now->Next->event_End)
{
//將其從阻塞鏈表中移除,并添加到優先級任務鏈表
Task_Now->Next->event_Pointer = NULL;
Task_Now->Next->ready = 1;
Task_Now1 = Task_Now->Next;
Task_Now->Next = Task_Now->Next->Next;
ADD_Task_To_Priority_List(Task_Now1);
continue;
}
Task_Now = Task_Now->Next;
}
//修改當前啟用任務
Now_Task = Task_Ready_List_Head.Next->Next_Task;
//修改優先級鏈表中下一個啟用任務
if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當前啟用任務是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
//更換下文
Stack_Last = Now_Task->tail_Stack;
#pragma asm
MOV SP,Stack_Last
#pragma endasm
EA = 1;
}
//任務阻塞
void Task_Block(uchar *event_pointer, uchar event_end)
{
uchar i;
EA = 0;
Now_Task->event_Pointer = event_pointer;
Now_Task->event_End = event_end;
Now_Task->ready = 0;
DEC_Task_Of_Priority_List(Now_Task);
Now_Task->Next = Block_List_Head.Next;
Block_List_Head.Next = Now_Task;
EA = 1;
TF0 = 1;
for(i = 0; i < 8; i++);
}
//任務等待時間
void Task_Wait(uchar Ms)
{
uchar i;
EA = 0;
for(i = 0; i < 8; i++)
{
if(biao[i] < 128)break;
}
if(i == 8)return;
biao[i] = 128;
Task_Block(&biao[i], Ms+128);
biao[i] = 0;
}
void Task_Init()
{
TMOD = 0x00;
TH0 = 0xF6;
TL0 = 0x3B;
TR0 = 1;
ET0 = 1;
#pragma asm
MOV Stack_Start,SP
#pragma endasm
Stack_Start += 10;
// 初始化鏈表頭
Task_Ready_List_Head.priority = 0;
Task_Ready_List_Head.Head_Task = NULL;
Task_Ready_List_Head.Next = NULL;
Task_Ready_List_Head.Next_Task = NULL;
}
// 添加任務
void Task_ADD(void * x, uchar Stack_Growth, uchar priority)
{
Task_List * list = malloc(sizeof(Task_List));// 定義任務鏈表
list->priority = priority; //優先級賦值
list->head_Stack =(uchar *)Stack_Start ; //棧頭地址賦值
//將任務PC指針壓入棧
#pragma asm
MOV Stack_Last,SP
MOV SP ,Stack_Start
MOV DPTR,#x?450
LCALL ?C?PLDXDATA
MOV R6,AR2
MOV R7,AR1
MOV A,R7
PUSH ACC
MOV A,R6
PUSH ACC
MOV SP, Stack_Last
#pragma endasm
Stack_Start += Stack_Growth + 15; //修改下一個棧開始位置
list->tail_Stack = &list->head_Stack[15]; //棧尾地址賦值
list->ready = 1; //阻塞/就緒態賦值
list->Next = NULL;
ADD_Task_To_Priority_List(list);
}
//從優先級任務鏈中刪除一個任務(將任務從就緒態中移除)
void DEC_Task_Of_Priority_List(Task_List * list)
{
uchar priority = list->priority;
Task_Ready_List* priority_List;
Task_Ready_List* new_priority_List;
Task_List * list1;
//查找優先級鏈表內是否已有所需優先級
for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
{
if(priority_List->Next->priority > priority)return;// 錯誤, 沒有找著所需優先級
if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于所需優先級
}
if(priority_List->Next == NULL)return;// 錯誤, 沒有找著所需優先級
if(priority_List->Next->Head_Task == NULL)goto ASDN;// 錯誤,當前優先級內沒有任務
if(priority_List->Next->Head_Task == list)// 判斷優先級任務頭是不是所需任務
{
priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務
goto ASDN;
}
//在當前優先級任務鏈內搜索所需任務
for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
{
if(list1->Next == list)
{
list1->Next = list1->Next->Next;// 從優先級任務鏈中刪除任務
break;
}
}
ASDN:
if(priority_List->Next->Head_Task == NULL)//當前優先級內沒有任何任務,刪除當前優先級任務鏈
{
new_priority_List = priority_List->Next;
priority_List->Next = priority_List->Next->Next;
// free(new_priority_List);
}
}
//添加一個任務到優先級任務鏈(將任務添加到就緒態)
void ADD_Task_To_Priority_List(Task_List * list)
{
uchar priority = list->priority;
Task_Ready_List* priority_List;
Task_Ready_List* new_priority_List;
//查找優先級鏈表內是否已有當前優先級
for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
{
if(priority_List->Next->priority > priority)goto NEWHEAD;
if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于當前優先級
}
if(priority_List->Next == NULL)// 優先級鏈表內沒有當前優先級
{
NEWHEAD:
//新建一個優先級頭
new_priority_List = malloc(sizeof(Task_Ready_List));
new_priority_List->Next = priority_List->Next;
priority_List->Next = new_priority_List;
priority_List->Next->priority = priority;
priority_List->Next->Next_Task = list;
priority_List->Next->Head_Task = NULL;
}
//更換優先級鏈內頭任務
list->Next = priority_List->Next->Head_Task;
priority_List->Next->Head_Task = list;
}
void Task_Start()
{
uchar* a;
Task_Ready_List* priority_List;
#pragma asm
MOV Stack_St,SP
#pragma endasm
Task_ADD(Free_Task, 2,55);// 添加空閑任務
//設置優先級鏈表中下一個啟用任務
for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
priority_List->Next_Task = priority_List->Head_Task;
//獲得當前啟用任務
Now_Task = Task_Ready_List_Head.Next->Head_Task;
//修改優先級鏈表中下一個啟用任務
if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當前啟用任務是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
// 修改棧指針指向位置
a = Task_Ready_List_Head.Next->Head_Task->tail_Stack;
#pragma asm
MOV SP, ACC
POP AR7
POP AR6
POP AR5
POP AR4
POP AR3
POP AR2
POP AR1
POP AR0
POP PSW
POP DPL
POP DPH
POP B
POP ACC
#pragma endasm
}
//空閑函數
void Free_Task()
{
while(1)
{
EA = 1;
}
}
復制代碼
作者:
hzn1990
時間:
2020-8-5 16:28
可以的,在完善一下。
作者:
Hui_Min
時間:
2020-8-11 15:21
更新:
1.刪除了所有匯編內容。
2.新增事件喚醒函數,現在可以方便的設計喚醒條件,并且可以知曉是由什么喚醒的任務。
-----------------------------------------------------------------------------------------------------------
#include <Task_Core.H>
#include <stdlib.h>
#include <Config.H>
/*------任務TCB結構體-------
//提示:任務棧內不包括局部變量
----------------------------*/
struct Task_Control_Block_List{
uchar* head_Stack; //任務棧頭
uchar* tail_Stack; //任務棧尾
uint Tick; //跳動計數,用于等待時間
void* event_function; //事件函數指針
uchar event_return; //事件返回值,用于確定喚醒任務的事件
uchar ready; //阻塞/就緒標志位
uchar priority; //優先級
struct Task_Control_Block_List* Next;
};
typedef struct Task_Control_Block_List Task_List;
struct Task_Priority_List{
struct Task_Priority_List * Next;
struct Task_Control_Block_List* Head_Task;
struct Task_Control_Block_List* Next_Task;
uchar priority;
}Task_Priority_List;
typedef struct Task_Priority_List Task_Ready_List;
static Task_List Block_List_Head; // 阻塞鏈表表頭
static Task_List* Now_Task; // 目前啟用任務
static Task_Ready_List Task_Ready_List_Head;// 優先級鏈表表頭
static uchar data Stack_Start; // 棧開始
static uchar data Stack_Last; // 上一個棧尾
static uchar data Stack_St; // 中間變量
static uint Tick;
//事件函數返回不是0的數即代表觸發事件
static uchar (*Event_Function)();
static void Free_Task();
static void ADD_Task_To_Priority_List(Task_List * list);
static void DEC_Task_Of_Priority_List(Task_List * list);
static void Timer() interrupt 1
{
Task_List* Task_Now;
Task_List* Task_Now1;
EA = 0;//禁止中斷嵌套
//保存上文
Stack_Last = SP;
SP = Stack_St;
Now_Task->tail_Stack =(uchar *) Stack_Last;
// 搜索阻塞鏈表中達成條件的任務
for(Task_Now = &Block_List_Head; Task_Now->Next != NULL;)
{
uchar a;
Event_Function = Task_Now->Next->event_function;
a = Event_Function();
if(a || --Task_Now->Next->Tick == 0)
{
//將其從阻塞鏈表中移除,并添加到優先級任務鏈表
Task_Now->Next->event_return = a;
Task_Now->Next->event_function = NULL;
Task_Now->Next->ready = 1;
Task_Now1 = Task_Now->Next;
Task_Now->Next = Task_Now->Next->Next;
ADD_Task_To_Priority_List(Task_Now1);
}
else
Task_Now = Task_Now->Next;
}
Tick++;// 時鐘跳動
//修改當前啟用任務
Now_Task = Task_Ready_List_Head.Next->Next_Task;
//修改優先級鏈表中下一個啟用任務
if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當前啟用任務是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
//更換下文
Stack_Last =(uchar) Now_Task->tail_Stack;
SP = Stack_Last;
EA = 1;
}
//無事件,用于僅等待時間的任務
static uchar Not_Event()
{
return 0;
}
/*--------------------任務阻塞-------------------------
Tick,任務等待超時時間,具體時間根據調度函數進入頻率確定
function, 事件函數
-----------------------------------------------------*/
uchar Task_Block(void* function, uint Tick)
{
EA = 0;
if(function == NULL)function = Not_Event;
Now_Task->event_function = function;
Now_Task->event_return = 255;
Now_Task->Tick = Tick;
Now_Task->ready = 0;
DEC_Task_Of_Priority_List(Now_Task);
Now_Task->Next = Block_List_Head.Next;
Block_List_Head.Next = Now_Task;
EA = 1;
TF0 = 1;
return Now_Task->Next->event_return;
// for(i = 0; i < 8; i++);
}
//任務初始化
void Task_Init()
{
TMOD = 0x00;
TH0 = 0xF6;
TL0 = 0x3B;
TR0 = 1;
ET0 = 1;
Stack_Start = SP;
Stack_Start += 10;
Task_Ready_List_Head.priority = 0;
Task_Ready_List_Head.Head_Task = NULL;
Task_Ready_List_Head.Next = NULL;
Task_Ready_List_Head.Next_Task = NULL;
Block_List_Head.Next = NULL;
}
/*--------------添加任務------------
//x, 任務頭函數
//Stack_Growth, 棧生長(內部已經加上寄存器以及函數頭所需的空間)
//priority, 優先級
------------------------------------*/
void Task_ADD(uint x, uchar Stack_Growth, uchar priority)
{
Task_List * list = malloc(sizeof(Task_List));// 定義任務鏈表
list->priority = priority; //優先級賦值
list->head_Stack =(uchar *)Stack_Start ; //棧頭地址賦值
((uchar*) Stack_Start)[0] = x % 256 ;
((uchar*) Stack_Start)[1] = x >> 8 ;
Stack_Start += Stack_Growth + 15; //修改棧結尾位置
list->tail_Stack = &list->head_Stack[14]; //棧尾地址賦值
list->ready = 1; //阻塞/就緒態賦值
list->Next = NULL;
ADD_Task_To_Priority_List(list);
}
//從優先級任務鏈中刪除一個任務
static void DEC_Task_Of_Priority_List(Task_List * list)
{
uchar priority = list->priority;
Task_Ready_List* priority_List;
Task_Ready_List* new_priority_List;
Task_List * list1;
//查找優先級鏈表內是否已有所需優先級
for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
{
if(priority_List->Next->priority > priority)return;// 錯誤, 沒有找著所需優先級
if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于所需優先級
}
if(priority_List->Next == NULL)return;// 錯誤, 沒有找著所需優先級
if(priority_List->Next->Head_Task == NULL);// 錯誤,當前優先級內沒有任務
else if(priority_List->Next->Head_Task == list)// 判斷優先級任務頭是不是所需任務
{
priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務
}
//在當前優先級任務鏈內搜索所需任務
else for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
{
if(list1->Next == list)
{
list1->Next = list1->Next->Next;// 從優先級任務鏈中刪除任務
break;
}
}
if(priority_List->Next->Head_Task == NULL)//當前優先級內沒有任何任務,刪除當前優先級任務鏈
{
new_priority_List = priority_List->Next;
priority_List->Next = priority_List->Next->Next;
free(new_priority_List);
}
}
//添加一個任務到優先級任務鏈
static void ADD_Task_To_Priority_List(Task_List * list)
{
uchar priority = list->priority;
Task_Ready_List* priority_List;
Task_Ready_List* new_priority_List;
//查找優先級鏈表內是否已有當前優先級
for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
{
if(priority_List->Next->priority > priority)goto NEWHEAD;
if(priority_List->Next->priority == priority)break;// 當前鏈表優先級等于當前優先級
}
if(priority_List->Next == NULL)// 優先級鏈表內沒有當前優先級
{
NEWHEAD:
//新建一個優先級頭
new_priority_List = malloc(sizeof(Task_Ready_List));
new_priority_List->Next = priority_List->Next;
priority_List->Next = new_priority_List;
priority_List->Next->priority = priority;
priority_List->Next->Next_Task = list;
priority_List->Next->Head_Task = NULL;
}
//更換優先級鏈內頭任務
list->Next = priority_List->Next->Head_Task;
priority_List->Next->Head_Task = list;
}
void Task_Start()
{
Task_Ready_List* priority_List;
Stack_St = SP;
Task_ADD(Free_Task, 4,55);// 添加空閑任務
//設置優先級鏈表中下一個啟用任務
for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
priority_List->Next_Task = priority_List->Head_Task;
//獲得當前啟用任務
Now_Task = Task_Ready_List_Head.Next->Head_Task;
//修改優先級鏈表中下一個啟用任務
if(Now_Task->Next != NULL)// 當前啟用任務不是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當前啟用任務是最后一個任務
Task_Ready_List_Head.Next->Next_Task = Task_Ready_List_Head.Next->Head_Task;
// 修改棧指針指向位置
SP =(uchar) Task_Ready_List_Head.Next->Head_Task->head_Stack + 1;
EA = 1;
TF0 = 1;
}
static void Free_Task()
{
EA = 1;
while(1)
{
EA = 1;
}
}
復制代碼
----------------------------------------------------------
調用示例
void main()
{
int i;
EA = 0;
init_mempool(mem, sizeof(mem));
Task_Init();
Task_ADD(mian, 4,2);
Task_ADD(Key_Read,12,2);
Task_ADD(Main_Dis, 16,1);
Task_Start();
}
復制代碼
---------------------------------------------------
事件函數示例
uchar Dis_event()
{
return Dis_Start == 1;
}
//調用
Task_Block(Dis_event, 65535);
復制代碼
作者:
hzn1990
時間:
2020-12-21 19:19
厲害。。。。。。
作者:
安華
時間:
2022-6-20 23:03
人才!!!
作者:
fumky
時間:
2022-6-21 20:30
大神厲害,膜拜~~
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
91在线看片
|
日日夜夜精品视频
|
男人天堂av网站
|
日韩电影一区
|
国产亚洲网站
|
国产91丝袜在线18
|
亚洲精品黄色
|
午夜爽爽爽男女免费观看
|
色精品视频
|
午夜三区
|
91成人免费看
|
欧美在线激情
|
日韩免费中文字幕
|
日本三级全黄三级a
|
一级欧美
|
国产资源一区二区三区
|
成人午夜黄色
|
中文视频在线
|
欧美精品一区二区三区在线播放
|
欧美伊人久久久久久久久影院
|
亚洲日韩中文字幕一区
|
亚洲欧洲成人
|
亚洲视频在线看
|
九九久久这里只有精品
|
精品一区二区在线看
|
国产综合精品一区二区三区
|
精品国模一区二区三区欧美
|
伊人久久综合影院
|
国产一级视频在线播放
|
999re5这里只有精品
|
琪琪午夜伦伦电影福利片
|
国产精品夜间视频香蕉
|
欧美日本一区
|
欧美一级片在线
|
在线天堂免费中文字幕视频
|
亚洲精品68久久久一区
|
中文字字幕一区二区三区四区五区
|
亚洲区一区二
|
国产精品久久久久久影院8一贰佰
|
欧美精品在线一区
|
欧美区日韩区
|