📄 unit.c
字号:
#include "ebos.h"
/*
*********************************************************************************************************
* Common COMPOENT FILE
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* Common control block
*********************************************************************************************************
*/
void AddList(void **head, void *add_node,INT8U type)
{
LIST_NODE *node;
LIST_NODE *new_node;
new_node=(LIST_NODE *)add_node;
if(*head==NULL){
new_node->previous=new_node;
new_node->next=new_node;
*head=new_node;
return;
}
node=(LIST_NODE *)*head;
if (type==PRIORITY){
do {
if(node->priority>new_node->priority) break;
node=node->next;
}while (node!=*head);
}
new_node->previous=node->previous;
new_node->next=node;
(node->previous)->next=new_node;
node->previous=new_node;
if (node==*head && type==PRIORITY)
*head=new_node;
}
void DelList(void **head, void *del_node)
{
LIST_NODE *node;
node=(LIST_NODE *)del_node;
if(*head==NULL) return;
if(node->next!=node){
(node->previous)->next=node->next;
(node->next)->previous=node->previous;
if(node==*head){
*head=node->next;
}
}
else{
*head=NULL;
}
}
void DelHead(void **head)
{
LIST_NODE *node;
node=(LIST_NODE *)(*head);
if(*head==NULL) return;
if(node->next!=node){
(node->previous)->next=node->next;
(node->next)->previous=node->previous;
if(node==*head){
*head=node->next;
}
}
else{
*head=NULL;
}
}
void AddTaskList(TASK_TCB **head, TASK_TCB *new_node,INT8U type)
{
TASK_TCB *node;
if(*head==NULL){
new_node->prevrdy=new_node;
new_node->nextrdy=new_node;
*head=new_node;
return;
}
node=*head;
if(type==PRIORITY){
do {
if(node->priority<new_node->priority) break;
node=node->nextrdy;
}while (node!=*head);
}
new_node->nextrdy=node;
new_node->prevrdy=node->prevrdy;
(node->prevrdy)->nextrdy=new_node;
node->prevrdy=new_node;
if (node==*head && type==PRIORITY)
*head=new_node;
}
void DelTaskList(TASK_TCB **head, TASK_TCB *node)
{
if(*head==NULL) return;
if(node->nextrdy!=node){
(node->prevrdy)->nextrdy=node->nextrdy;
(node->nextrdy)->prevrdy=node->prevrdy;
if(node==*head){
*head=node->nextrdy;
}
}
else{
*head=NULL;
}
}
void DebugLog(INT8U opcode,INT8U task_name)
{
printf("%d",opcode);
printf("%s",task_name);
}
/*
*********************************************************************************************************
以下一组函数用于结构的保护和释放.
DoProtect函数在多线程对一个资源存取时,如果其中一个线程获得该资源,则该线程被调度运行.直到它释放了该资源,
则挂起,控制返还给调用Protect的线程.
发生不一致的情况
1 在一个线程正对一个控制结构进行读取时,并根据该结果进行操作,若这时发生中断,进入另一个线程,
对该结构进行了修改,在重新进入原先线程时,还用原来读的数据往下操作就发生结构不一致的错误.也就是对同一个结构的存取不能打断.
如各种公用的结构表,数组,TCB的状态,优先级等。
2 一个线程在修改一个全局变量时,另一个线程也对同一个变量进行,就会造成其中一个修改无效的不一致
因此 在可能发生多个线程对同一个全局变量发生修改,并且结果可能不同时要对该结构进行保护,全局变量不能同时修改
或一个线程正对一个控制结构进行读取操作并根据该结果进行全局结构的修改时,并且可能发生另一个线程对该读取的变量量修改时,要进行保护
*********************************************************************************************************
UnProtect函数释放当前激活线程对资源的占用.
*********************************************************************************************************
DoProtect,UnProtect函数是对当前线程结构的保护。
*********************************************************************************************************
*/
void DoProtect(void *task_ptr)
{
EnLock();
#if DIRECT_SCHED==TRUE
if(task_ptr==NULL){
UnLock();
return ;
}
if(((TASK_TCB *)task_ptr)->current_protect){
AddList(&(((TASK_TCB *)task_ptr)->current_protect),KERNAL.current_thread,0);
ScheduleToLockTask(((TASK_TCB *)task_ptr)->current_protect);
}
else
AddList(&(((TASK_TCB *)task_ptr)->current_protect),KERNAL.current_thread,0);
UnLock();
#endif
}
/*
/*********************************************************************************************************/
void UnProtect(void *task_ptr)
{
#if DIRECT_SCHED==TRUE
EnLock();
if(task_ptr==NULL){
UnLock();
return ;
}
DelList(&(((TASK_TCB *)task_ptr)->current_protect),(((TASK_TCB *)task_ptr)->current_protect));
if(((TASK_TCB *)task_ptr)->current_protect!=NULL){
ScheduleToLockTask(((TASK_TCB *)task_ptr)->current_protect);
}
#endif
UnLock();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -