亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
自己摸了一個(gè)操作系統(tǒng)內(nèi)核,發(fā)出來(lái)給大家看看。
[打印本頁(yè)]
作者:
Hui_Min
時(shí)間:
2020-7-28 09:24
標(biāo)題:
自己摸了一個(gè)操作系統(tǒng)內(nèi)核,發(fā)出來(lái)給大家看看。
溫馨提示: 1.該內(nèi)核僅供學(xué)習(xí)和參考使用。
2.大概率不會(huì)再更新(沒(méi)必要造輪子)。
3.該內(nèi)核并不成熟,如要使用操作系統(tǒng)請(qǐng)尋找市面上成熟的內(nèi)核。 4.個(gè)人不喜歡大片的注釋,注釋僅僅說(shuō)明大致功能,細(xì)節(jié)需自行理解。
#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; //時(shí)間指針
uchar event_End; //時(shí)間結(jié)束
uchar ready; //就緒狀態(tài)
uchar priority; //優(yōu)先級(jí)
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;
//添加任務(wù)到優(yōu)先級(jí)鏈
void ADD_Task_To_Priority_List(Task_List * list);
//從優(yōu)先級(jí)鏈中刪除任務(wù)
void DEC_Task_Of_Priority_List(Task_List * list);
static Task_List Block_List_Head; // 阻塞鏈表表頭
static Task_List* Now_Task; // 目前啟用任務(wù)
static Task_Ready_List Task_Ready_List_Head;// 優(yōu)先級(jí)鏈表表頭
static uchar data Stack_Start; // 棧開(kāi)始
static uchar data Stack_Last; // 上一個(gè)棧尾
static uchar data Stack_St; // 中間變量
//任務(wù)調(diào)度函數(shù)
#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;
// 搜索阻塞鏈表中達(dá)成條件的任務(wù)
for(Task_Now = &Block_List_Head; Task_Now->Next != NULL;)
{
if(Task_Now->Next->event_Pointer[0] >= Task_Now->Next->event_End)
{
//將其從阻塞鏈表中移除,并添加到優(yōu)先級(jí)任務(wù)鏈表
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;
}
//修改當(dāng)前啟用任務(wù)
Now_Task = Task_Ready_List_Head.Next->Next_Task;
//修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
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;
}
//任務(wù)阻塞
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++);
}
//任務(wù)等待時(shí)間
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;
}
// 添加任務(wù)
void Task_ADD(void * x, uchar Stack_Growth, uchar priority)
{
Task_List * list = malloc(sizeof(Task_List));// 定義任務(wù)鏈表
list->priority = priority; //優(yōu)先級(jí)賦值
list->head_Stack =(uchar *)Stack_Start ; //棧頭地址賦值
//將任務(wù)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; //修改下一個(gè)棧開(kāi)始位置
list->tail_Stack = &list->head_Stack[15]; //棧尾地址賦值
list->ready = 1; //阻塞/就緒態(tài)賦值
list->Next = NULL;
ADD_Task_To_Priority_List(list);
}
//從優(yōu)先級(jí)任務(wù)鏈中刪除一個(gè)任務(wù)(將任務(wù)從就緒態(tài)中移除)
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;
//查找優(yōu)先級(jí)鏈表內(nèi)是否已有所需優(yōu)先級(jí)
for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
{
if(priority_List->Next->priority > priority)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
if(priority_List->Next->priority == priority)break;// 當(dāng)前鏈表優(yōu)先級(jí)等于所需優(yōu)先級(jí)
}
if(priority_List->Next == NULL)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
if(priority_List->Next->Head_Task == NULL)goto ASDN;// 錯(cuò)誤,當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任務(wù)
if(priority_List->Next->Head_Task == list)// 判斷優(yōu)先級(jí)任務(wù)頭是不是所需任務(wù)
{
priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務(wù)
goto ASDN;
}
//在當(dāng)前優(yōu)先級(jí)任務(wù)鏈內(nèi)搜索所需任務(wù)
for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
{
if(list1->Next == list)
{
list1->Next = list1->Next->Next;// 從優(yōu)先級(jí)任務(wù)鏈中刪除任務(wù)
break;
}
}
ASDN:
if(priority_List->Next->Head_Task == NULL)//當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任何任務(wù),刪除當(dāng)前優(yōu)先級(jí)任務(wù)鏈
{
new_priority_List = priority_List->Next;
priority_List->Next = priority_List->Next->Next;
// free(new_priority_List);
}
}
//添加一個(gè)任務(wù)到優(yōu)先級(jí)任務(wù)鏈(將任務(wù)添加到就緒態(tài))
void ADD_Task_To_Priority_List(Task_List * list)
{
uchar priority = list->priority;
Task_Ready_List* priority_List;
Task_Ready_List* new_priority_List;
//查找優(yōu)先級(jí)鏈表內(nèi)是否已有當(dāng)前優(yōu)先級(jí)
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;// 當(dāng)前鏈表優(yōu)先級(jí)等于當(dāng)前優(yōu)先級(jí)
}
if(priority_List->Next == NULL)// 優(yōu)先級(jí)鏈表內(nèi)沒(méi)有當(dāng)前優(yōu)先級(jí)
{
NEWHEAD:
//新建一個(gè)優(yōu)先級(jí)頭
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;
}
//更換優(yōu)先級(jí)鏈內(nèi)頭任務(wù)
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);// 添加空閑任務(wù)
//設(shè)置優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
priority_List->Next_Task = priority_List->Head_Task;
//獲得當(dāng)前啟用任務(wù)
Now_Task = Task_Ready_List_Head.Next->Head_Task;
//修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
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
}
//空閑函數(shù)
void Free_Task()
{
while(1)
{
EA = 1;
}
}
復(fù)制代碼
作者:
hzn1990
時(shí)間:
2020-8-5 16:28
可以的,在完善一下。
作者:
Hui_Min
時(shí)間:
2020-8-11 15:21
更新:
1.刪除了所有匯編內(nèi)容。
2.新增事件喚醒函數(shù),現(xiàn)在可以方便的設(shè)計(jì)喚醒條件,并且可以知曉是由什么喚醒的任務(wù)。
-----------------------------------------------------------------------------------------------------------
#include <Task_Core.H>
#include <stdlib.h>
#include <Config.H>
/*------任務(wù)TCB結(jié)構(gòu)體-------
//提示:任務(wù)棧內(nèi)不包括局部變量
----------------------------*/
struct Task_Control_Block_List{
uchar* head_Stack; //任務(wù)棧頭
uchar* tail_Stack; //任務(wù)棧尾
uint Tick; //跳動(dòng)計(jì)數(shù),用于等待時(shí)間
void* event_function; //事件函數(shù)指針
uchar event_return; //事件返回值,用于確定喚醒任務(wù)的事件
uchar ready; //阻塞/就緒標(biāo)志位
uchar priority; //優(yōu)先級(jí)
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; // 目前啟用任務(wù)
static Task_Ready_List Task_Ready_List_Head;// 優(yōu)先級(jí)鏈表表頭
static uchar data Stack_Start; // 棧開(kāi)始
static uchar data Stack_Last; // 上一個(gè)棧尾
static uchar data Stack_St; // 中間變量
static uint Tick;
//事件函數(shù)返回不是0的數(shù)即代表觸發(fā)事件
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;
// 搜索阻塞鏈表中達(dá)成條件的任務(wù)
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)
{
//將其從阻塞鏈表中移除,并添加到優(yōu)先級(jí)任務(wù)鏈表
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++;// 時(shí)鐘跳動(dòng)
//修改當(dāng)前啟用任務(wù)
Now_Task = Task_Ready_List_Head.Next->Next_Task;
//修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
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;
}
//無(wú)事件,用于僅等待時(shí)間的任務(wù)
static uchar Not_Event()
{
return 0;
}
/*--------------------任務(wù)阻塞-------------------------
Tick,任務(wù)等待超時(shí)時(shí)間,具體時(shí)間根據(jù)調(diào)度函數(shù)進(jìn)入頻率確定
function, 事件函數(shù)
-----------------------------------------------------*/
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++);
}
//任務(wù)初始化
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;
}
/*--------------添加任務(wù)------------
//x, 任務(wù)頭函數(shù)
//Stack_Growth, 棧生長(zhǎng)(內(nèi)部已經(jīng)加上寄存器以及函數(shù)頭所需的空間)
//priority, 優(yōu)先級(jí)
------------------------------------*/
void Task_ADD(uint x, uchar Stack_Growth, uchar priority)
{
Task_List * list = malloc(sizeof(Task_List));// 定義任務(wù)鏈表
list->priority = priority; //優(yōu)先級(jí)賦值
list->head_Stack =(uchar *)Stack_Start ; //棧頭地址賦值
((uchar*) Stack_Start)[0] = x % 256 ;
((uchar*) Stack_Start)[1] = x >> 8 ;
Stack_Start += Stack_Growth + 15; //修改棧結(jié)尾位置
list->tail_Stack = &list->head_Stack[14]; //棧尾地址賦值
list->ready = 1; //阻塞/就緒態(tài)賦值
list->Next = NULL;
ADD_Task_To_Priority_List(list);
}
//從優(yōu)先級(jí)任務(wù)鏈中刪除一個(gè)任務(wù)
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;
//查找優(yōu)先級(jí)鏈表內(nèi)是否已有所需優(yōu)先級(jí)
for(priority_List = &Task_Ready_List_Head; priority_List->Next != NULL; priority_List = priority_List->Next)
{
if(priority_List->Next->priority > priority)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
if(priority_List->Next->priority == priority)break;// 當(dāng)前鏈表優(yōu)先級(jí)等于所需優(yōu)先級(jí)
}
if(priority_List->Next == NULL)return;// 錯(cuò)誤, 沒(méi)有找著所需優(yōu)先級(jí)
if(priority_List->Next->Head_Task == NULL);// 錯(cuò)誤,當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任務(wù)
else if(priority_List->Next->Head_Task == list)// 判斷優(yōu)先級(jí)任務(wù)頭是不是所需任務(wù)
{
priority_List->Next->Head_Task = priority_List->Next->Head_Task->Next;// 刪除改任務(wù)
}
//在當(dāng)前優(yōu)先級(jí)任務(wù)鏈內(nèi)搜索所需任務(wù)
else for(list1 = priority_List->Next->Head_Task; list1->Next != NULL; list1 = list1->Next)
{
if(list1->Next == list)
{
list1->Next = list1->Next->Next;// 從優(yōu)先級(jí)任務(wù)鏈中刪除任務(wù)
break;
}
}
if(priority_List->Next->Head_Task == NULL)//當(dāng)前優(yōu)先級(jí)內(nèi)沒(méi)有任何任務(wù),刪除當(dāng)前優(yōu)先級(jí)任務(wù)鏈
{
new_priority_List = priority_List->Next;
priority_List->Next = priority_List->Next->Next;
free(new_priority_List);
}
}
//添加一個(gè)任務(wù)到優(yōu)先級(jí)任務(wù)鏈
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;
//查找優(yōu)先級(jí)鏈表內(nèi)是否已有當(dāng)前優(yōu)先級(jí)
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;// 當(dāng)前鏈表優(yōu)先級(jí)等于當(dāng)前優(yōu)先級(jí)
}
if(priority_List->Next == NULL)// 優(yōu)先級(jí)鏈表內(nèi)沒(méi)有當(dāng)前優(yōu)先級(jí)
{
NEWHEAD:
//新建一個(gè)優(yōu)先級(jí)頭
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;
}
//更換優(yōu)先級(jí)鏈內(nèi)頭任務(wù)
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);// 添加空閑任務(wù)
//設(shè)置優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
for(priority_List = Task_Ready_List_Head.Next; priority_List != NULL; priority_List = priority_List->Next)
priority_List->Next_Task = priority_List->Head_Task;
//獲得當(dāng)前啟用任務(wù)
Now_Task = Task_Ready_List_Head.Next->Head_Task;
//修改優(yōu)先級(jí)鏈表中下一個(gè)啟用任務(wù)
if(Now_Task->Next != NULL)// 當(dāng)前啟用任務(wù)不是最后一個(gè)任務(wù)
Task_Ready_List_Head.Next->Next_Task = Now_Task->Next;
else // 當(dāng)前啟用任務(wù)是最后一個(gè)任務(wù)
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;
}
}
復(fù)制代碼
----------------------------------------------------------
調(diào)用示例
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();
}
復(fù)制代碼
---------------------------------------------------
事件函數(shù)示例
uchar Dis_event()
{
return Dis_Start == 1;
}
//調(diào)用
Task_Block(Dis_event, 65535);
復(fù)制代碼
作者:
hzn1990
時(shí)間:
2020-12-21 19:19
厲害。。。。。。
作者:
安華
時(shí)間:
2022-6-20 23:03
人才!!!
作者:
fumky
時(shí)間:
2022-6-21 20:30
大神厲害,膜拜~~
作者:
lsl331
時(shí)間:
2025-12-28 22:33
記錄, 來(lái)學(xué)習(xí)一下思路
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1