?? sosos.c
字號:
if(SOSOS_RUNNING_INHERIT_PRI>i){
#else
if(SOSOS_RUNNING_TASK_PRI>i){
#endif
set_bit(SOSOS_STATE,STATE_SCHED_REQ);
}
return;
}
}
point++;
tmpj<<=1;
}
}
}
#endif
#if SOSOS_COUNT_SEM_ENABLE == 1
void SososCreateCountSem(SOSOS_SEM *sem,SOSOS_SEM value)//創(chuàng)建計數(shù)型信號量
//sem為要創(chuàng)建的數(shù)字型信號量的指針
//value為要創(chuàng)建時的初始值{
(*sem)=value;
}
#endif
#if SOSOS_QUERY_SEM_ENABLE == 1 && SOSOS_COUNT_SEM_ENABLE == 1
SOSOS_SEM SososQueryCountSem(SOSOS_SEM *sem)//查詢計數(shù)型信號量
{
return (*sem);
}
#endif
#if SOSOS_COUNT_SEM_ENABLE == 1
unsigned char SososCountSemPend(SOSOS_SEM *sem,SOSOS_TIMEOUT_TYPE timeout)//等待計數(shù)型信號量
//本函數(shù)用于等待指定的計數(shù)型信號量為有效,有效則立即返回,不能用在中斷中
//sem為計數(shù)型信號量的指針
//timeout為等待時間,單位:時間間隔,0:為無限期等待
{
unsigned char temp;
ENTER_CRITICAL();
if((*sem)>0){
(*sem)--;
}
else{
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE=TASK_STATE_SEM;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].EVENT_INDICATION=(SOSOS_ADDRESS)sem;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_TIMEOUT=timeout;
SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]=SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]&(~SOSOS_RUNNING_TASK_ID_INDEX);//清除任務(wù)就緒狀態(tài)
if(timeout>0)
set_bit(SOSOS_WAIT_TASK,SOSOS_RUNNING_TASK_PRI);
SososScheder();//重新調(diào)度
}
if(TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE==TASK_STATE_SEM_TIMEOUT)
temp=SOSOS_TASK_TIMEOUT;
else{
if((*sem)>0)
(*sem)--;
temp=SOSOS_OK;
}
EXIT_CRITICAL();
return temp;
}
#endif
#if SOSOS_COUNT_SEM_ENABLE == 1
void SososCountSemPost(SOSOS_SEM *sem)//發(fā)送計數(shù)型信號量
//將指定的計數(shù)型信號量加一,若有等待該信號量的高優(yōu)先級任務(wù),則進行任務(wù)切換
{
ENTER_CRITICAL();
if((*sem)<SOSOS_SEM_MAX_VALUE)
(*sem)++;
if((*sem)==1){
ENABLE_INTERRUPT();
SOSOS_SEARCH_ALL_WAIT_SIGNAL_TASK((SOSOS_ADDRESS)sem);//搜尋等待信號的任務(wù)
if(test_1(SOSOS_STATE,STATE_SCHED_REQ)&&test_0(SOSOS_STATE,STATE_SCHED_RUN)&&(SOSOS_INT_NEST==0))
SososScheder();
}
EXIT_CRITICAL();
}
#endif
#if SOSOS_LOGIC_SEM_ENABLE == 1
void SososCreateLogicSem(SOSOS_SEM *sem,SOSOS_SEM value)//創(chuàng)建邏輯型信號量
//sem為指向信號量的指針
//value為創(chuàng)建時設(shè)置的初始值{
(*sem)=value;
}
#endif
#if SOSOS_QUERY_SEM_ENABLE == 1 && SOSOS_LOGIC_SEM_ENABLE == 1
SOSOS_SEM SososQueryLogicSem(SOSOS_SEM *sem)//查詢邏輯型信號量
//sem為指向信號量的指針
//信號量空閑返回:SOSOS_SIGNAL_FREE;信號量被占有返回:SOSOS_SIGNAL_ENGROSS{
return (*sem);
}
#endif
#if SOSOS_LOGIC_SEM_ENABLE == 1
unsigned char SososLogicSemPend(SOSOS_SEM *sem,SOSOS_TIMEOUT_TYPE timeout)//等待邏輯型信號量
//本函數(shù)用于等待指定的邏輯型信號量為有效,有效則立即返回,不能用在中斷中
//sem為邏輯型信號量的指針
//timeout為等待時間,單位:時間間隔,0:為無限期等待
{
unsigned char temp;
ENTER_CRITICAL();
if((*sem)==SOSOS_SIGNAL_FREE){
(*sem)=SOSOS_SIGNAL_ENGROSS;
}
else{
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE=TASK_STATE_SEM;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].EVENT_INDICATION=(SOSOS_ADDRESS)sem;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_TIMEOUT=timeout;
SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]=SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]&(~SOSOS_RUNNING_TASK_ID_INDEX);//清除任務(wù)就緒狀態(tài)
if(timeout>0)
set_bit(SOSOS_WAIT_TASK,SOSOS_RUNNING_TASK_PRI);
SososScheder();//重新調(diào)度
}
if(TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE==TASK_STATE_SEM_TIMEOUT)
temp=SOSOS_TASK_TIMEOUT;
else{
(*sem)=SOSOS_SIGNAL_ENGROSS;
temp=SOSOS_OK;
}
EXIT_CRITICAL();
return temp;
}
#endif
#if SOSOS_LOGIC_SEM_ENABLE == 1
void SososLogicSemPost(SOSOS_SEM *sem)//發(fā)送邏輯型信號量
//將指定的邏輯型信號量置為可用,若有等待該信號量的高優(yōu)先級任務(wù),則進行任務(wù)切換
{
ENTER_CRITICAL();
if((*sem)==SOSOS_SIGNAL_ENGROSS){
(*sem)=SOSOS_SIGNAL_FREE;
ENABLE_INTERRUPT();
SOSOS_SEARCH_ALL_WAIT_SIGNAL_TASK((SOSOS_ADDRESS)sem);//搜尋等待信號的任務(wù)
if(test_1(SOSOS_STATE,STATE_SCHED_REQ)&&test_0(SOSOS_STATE,STATE_SCHED_RUN)&&(SOSOS_INT_NEST==0))
SososScheder();
}
EXIT_CRITICAL();
}
#endif
#if SOSOS_MUTEX_ENABLE == 1
void SososCreateMutex(SOSOS_MUTEX *mutex,unsigned char value)//創(chuàng)建互斥型信號量//mutex為指向信號量的指針,將新加入信號量放在列表的最后
//value為創(chuàng)建信號量時的初始值,可為SOSOS_SIGNAL_FREE或SOSOS_SIGNAL_ENGROSS
{
SOSOS_MUTEX *point;
if(SOSOS_MUTEX_POINT==0)//列表為空時,作為第一個成員
SOSOS_MUTEX_POINT=mutex;
else{//已有成員時,添加在列表末尾
point=SOSOS_MUTEX_POINT;
while(1){
if((point->NEXT_MUTEX)==0){
point->NEXT_MUTEX=(SOSOS_ADDRESS)mutex;
break;
}
point=(SOSOS_MUTEX *)point->NEXT_MUTEX;
}
}//已有成員時,添加在列表末尾
mutex->NEXT_MUTEX=0;//表示為最后一個列表成員
mutex->MUTEX_VALUE=value;
mutex->INHERIT_PRI=SOSOS_PRI_MAX-1;
}
#endif
#if SOSOS_QUERY_MUTEX_ENABLE == 1
unsigned char SososQueryMutex(SOSOS_MUTEX *mutex)//查詢互斥型信號量狀態(tài)
//查詢指定的互斥型信號量的狀態(tài),可用在中斷函數(shù)中
{
return (mutex->MUTEX_VALUE);
}
#endif
#if SOSOS_MUTEX_ENABLE == 1
void SososInsertMutex(SOSOS_MUTEX *mutex)//調(diào)整互斥信號量在表內(nèi)的位置
//系統(tǒng)內(nèi)部使用,用于調(diào)整互斥型信號量在鏈表中的位置,信號量在鏈表中是按
//繼承后的優(yōu)先級從高到低排列(優(yōu)先級數(shù)值從小到大),沒有被占用的信號量
//的優(yōu)先級被指定為最低可用優(yōu)先級
{
SOSOS_MUTEX *mutex_point,*pre_point;
//從列表中去除指定的信號量
if(SOSOS_MUTEX_POINT==mutex){//是第一個成員
SOSOS_MUTEX_POINT=0;
}//是第一個成員
else{//不是第一個成員
mutex_point=SOSOS_MUTEX_POINT;
while(mutex_point!=0){
if((mutex_point->NEXT_MUTEX)==(SOSOS_ADDRESS)mutex){
mutex_point->NEXT_MUTEX=mutex->NEXT_MUTEX;
break;
}
mutex_point=(SOSOS_MUTEX *)mutex_point->NEXT_MUTEX;
}
}//不是第一個成員
//按優(yōu)先級插人該成員
if(SOSOS_MUTEX_POINT==0){//隊列為空
SOSOS_MUTEX_POINT=mutex;
mutex->NEXT_MUTEX=0;
}//隊列為空
else{//隊列不空
if((SOSOS_MUTEX_POINT->INHERIT_PRI)>=(mutex->INHERIT_PRI)){//被插入成員是隊列中的最高優(yōu)先級成員
mutex->NEXT_MUTEX=SOSOS_MUTEX_POINT->NEXT_MUTEX;
SOSOS_MUTEX_POINT=mutex;
}//被插入成員是隊列中的最高優(yōu)先級成員
else{//其他情況
pre_point=SOSOS_MUTEX_POINT;
while(1){
mutex_point=(SOSOS_MUTEX *)(pre_point->NEXT_MUTEX);
if((mutex_point->INHERIT_PRI)>=(mutex->INHERIT_PRI)){
pre_point->NEXT_MUTEX=(SOSOS_ADDRESS)mutex;
mutex->NEXT_MUTEX=(SOSOS_ADDRESS)mutex_point;
break;
}
pre_point=mutex_point;
}
}//其他情況
}//隊列不空
}
unsigned char SososGetMutex(SOSOS_MUTEX *mutex,SOSOS_TIMEOUT_TYPE timeout)//獲得互斥型信號量
//在規(guī)定的時間內(nèi)等待信號量,若得到信號量返回SOSOS_OK,若超時返回SOSOS_TASK_TIMEOUT
//mutex為請求的互斥型信號量
//timeout為超時時間,單位是ticks;0為無限期等待
{
unsigned char temp;
ENTER_CRITICAL();
if((mutex->MUTEX_VALUE)==SOSOS_SIGNAL_FREE){//信號量空閑
mutex->INHERIT_PRI=SOSOS_RUNNING_INHERIT_PRI;
mutex->OWN_TASK_PRI=SOSOS_RUNNING_TASK_PRI;
mutex->OWN_TASK_ID=SOSOS_RUNNING_TASK_ID;
mutex->MUTEX_VALUE=SOSOS_SIGNAL_ENGROSS;
SososInsertMutex(mutex);//調(diào)整互斥型信號量列表
}//信號量空閑
else{//信號量被占用
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE=TASK_STATE_MUTEX;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].EVENT_INDICATION=(SOSOS_ADDRESS)mutex;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_TIMEOUT=timeout;
SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]=SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]&(~SOSOS_RUNNING_TASK_ID_INDEX);//清除任務(wù)就緒狀態(tài)
if(SOSOS_RUNNING_INHERIT_PRI<(mutex->INHERIT_PRI)){
mutex->INHERIT_PRI=SOSOS_RUNNING_INHERIT_PRI;
SososInsertMutex(mutex);
}
if(timeout>0)
set_bit(SOSOS_WAIT_TASK,SOSOS_RUNNING_TASK_PRI);
SososScheder();//重新調(diào)度
}//信號量被占用
if(TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE==TASK_STATE_MUTEX_TIMEOUT)
temp=SOSOS_TASK_TIMEOUT;
else{
mutex->INHERIT_PRI=SOSOS_RUNNING_INHERIT_PRI;
mutex->OWN_TASK_PRI=SOSOS_RUNNING_TASK_PRI;
mutex->OWN_TASK_ID=SOSOS_RUNNING_TASK_ID;
mutex->MUTEX_VALUE=SOSOS_SIGNAL_ENGROSS;
SososInsertMutex(mutex);
temp=SOSOS_OK;
}
EXIT_CRITICAL();
return temp;
}
#endif
#if SOSOS_MUTEX_ENABLE == 1
void SOSOS_MUTEX_SEARCH_ALL_PRI_TASK(SOSOS_MUTEX * POINT)//搜尋等待互斥型信號量的任務(wù)
//系統(tǒng)內(nèi)部使用,用于在任務(wù)控制塊中搜索等待指定互斥型信號量的任務(wù)
{
unsigned char i,j;
SOSOS_TCB *point;
point=TCB;
for(i=0;i<SOSOS_PRI_MAX;i++){
for(j=0;j<SOSOS_MAX_TASK_PER_PRI;j++){
if(point->TASK_STATE==TASK_STATE_MUTEX){
if(point->EVENT_INDICATION==(SOSOS_ADDRESS)POINT){
set_bit(SOSOS_TASK_READY[i],j);
point->TASK_STATE=TASK_STATE_OK;
if(SOSOS_RUNNING_INHERIT_PRI>i){
set_bit(SOSOS_STATE,STATE_SCHED_REQ);
}
//獲得該互斥型信號量
POINT->INHERIT_PRI=i;
POINT->OWN_TASK_PRI=i;
POINT->OWN_TASK_ID=j;
POINT->MUTEX_VALUE=SOSOS_SIGNAL_ENGROSS;
SososInsertMutex(POINT);//調(diào)整互斥型信號量列表
return;
}
}
point++;
}
}
//恢復(fù)互斥型信號量為空閑狀態(tài)
POINT->INHERIT_PRI=SOSOS_PRI_MAX-1;
POINT->MUTEX_VALUE=SOSOS_SIGNAL_FREE;
SososInsertMutex(POINT);//調(diào)整互斥型信號量列表
}
#endif
#if SOSOS_MUTEX_ENABLE == 1
void SososFreeMutex(SOSOS_MUTEX *mutex)//釋放互斥型信號量
//釋放指定的互斥型信號量
{
ENTER_CRITICAL();
SOSOS_MUTEX_SEARCH_ALL_PRI_TASK(mutex);//搜尋等待互斥型信號量的任務(wù)
if(test_1(SOSOS_STATE,STATE_SCHED_REQ)&&test_0(SOSOS_STATE,STATE_SCHED_RUN)&&(SOSOS_INT_NEST==0))
SososScheder();
EXIT_CRITICAL();
}
#endif
#if SOSOS_FLAG_ENABLE ==1
void SososCreateFlag(SOSOS_EVENT_FLAG *FLAG,SOSOS_FLAG_TYPE *point,SOSOS_FLAG_TYPE wait,SOSOS_FLAG_TYPE msk)//創(chuàng)建事件標(biāo)志
{
//FLAG:事件標(biāo)記
//point:事件標(biāo)記組的指針
//wait:事件標(biāo)記等待的狀態(tài)
//msk:事件標(biāo)記屏蔽碼
FLAG->FLAG_POINT=point;
FLAG->FLAG_WAIT=wait&msk;
FLAG->FLAG_MSK=msk;
}
#endif
#if SOSOS_QUERY_FLAG_ENABLE == 1
SOSOS_FLAG_TYPE SososQueryFlag(SOSOS_EVENT_FLAG *FLAG)//查詢事件標(biāo)志狀態(tài)
{
//FLAG:事件標(biāo)記
return ((*(FLAG->FLAG_POINT))&(FLAG->FLAG_MSK));
}
#endif
#if SOSOS_FLAG_ENABLE ==1
unsigned char SososWaitFlag(SOSOS_EVENT_FLAG *FLAG,SOSOS_FLAG_TYPE wait,SOSOS_FLAG_TYPE msk,SOSOS_TIMEOUT_TYPE timeout)//等待指定的事件
{
//FLAG:事件標(biāo)記
//wait:事件標(biāo)記等待的狀態(tài)
//msk:事件標(biāo)記屏蔽碼
//timeout:等待溢出延時
unsigned char temp;
ENTER_CRITICAL();
FLAG->FLAG_WAIT=wait&msk;
FLAG->FLAG_MSK=msk;
if(((*(FLAG->FLAG_POINT))&msk)!=(wait&msk)){
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE=TASK_STATE_FLAG;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].EVENT_INDICATION=(SOSOS_ADDRESS)FLAG;
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_TIMEOUT=timeout;
SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]=SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]&(~SOSOS_RUNNING_TASK_ID_INDEX);//清除任務(wù)就緒狀態(tài)
if(timeout>0)
set_bit(SOSOS_WAIT_TASK,SOSOS_RUNNING_TASK_PRI);
SososScheder();//重新調(diào)度
}
if(TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STATE==TASK_STATE_FLAG_TIMEOUT)
temp=SOSOS_TASK_TIMEOUT;
else
temp=SOSOS_OK;
EXIT_CRITICAL();
return temp;
}
#endif
#if SOSOS_FLAG_ENABLE ==1
void SOSOS_FLAG_SEARCH_ALL_PRI_TASK(SOSOS_EVENT_FLAG *POINT)//搜尋等待事件標(biāo)志的任務(wù)
{
unsigned char i,j,tmp;
SOSOS_TCB *point;
point=TCB;
DISABLE_INTERRUPT();
tmp=*(POINT->FLAG_POINT);
for(i=0;i<SOSOS_PRI_MAX;i++){
for(j=0;j<SOSOS_MAX_TASK_PER_PRI;j++){
if(point->TASK_STATE==TASK_STATE_FLAG){
if((point->EVENT_INDICATION)==(SOSOS_ADDRESS)POINT){
if((POINT->FLAG_WAIT)==((POINT->FLAG_MSK)&tmp)){
set_bit(SOSOS_TASK_READY[i],j);
point->TASK_STATE=TASK_STATE_OK;
#if SOSOS_MUTEX_ENABLE == 1
if(SOSOS_RUNNING_INHERIT_PRI>i){
#else
if(SOSOS_RUNNING_TASK_PRI>i){
#endif
set_bit(SOSOS_STATE,STATE_SCHED_REQ);
}
return;
}
}
}
point++;
}
}
}
#endif
#if SOSOS_FLAG_ENABLE ==1
void SososChangeFlag(SOSOS_EVENT_FLAG *FLAG,SOSOS_FLAG_TYPE flag,unsigned char opt)//改變事件標(biāo)志
{
//FLAG:事件標(biāo)記
//flag:要改變的標(biāo)記位
//opt:進行的操作(設(shè)置 或 清除)
ENTER_CRITICAL();
if(opt==SOSOS_FLAG_OPT_CLR)
*(FLAG->FLAG_POINT)&=(~flag);
else
*(FLAG->FLAG_POINT)|=flag;
ENABLE_INTERRUPT();
SOSOS_FLAG_SEARCH_ALL_PRI_TASK(FLAG);//搜尋等待事件標(biāo)志的任務(wù)
if(test_1(SOSOS_STATE,STATE_SCHED_REQ)&&test_0(SOSOS_STATE,STATE_SCHED_RUN)&&(SOSOS_INT_NEST==0))
SososScheder();
EXIT_CRITICAL();
}
#endif
#if SOSOS_TASK_ENALBE == 1
void SososStartOs(void)//啟動SOSOS系統(tǒng)
{
#if SOSOS_MUTEX_ENABLE == 1
SOSOS_RUNNING_INHERIT_PRI=SOSOS_PRI_MAX-1;
#endif
SOSOS_RUNNING_TASK_PRI=SOSOS_PRI_MAX-1;
SOSOS_RUNNING_TASK_ID=SOSOS_MAX_TASK_PER_PRI-1;
SOSOS_RUNNING_TASK_ID_INDEX=1<<SOSOS_RUNNING_TASK_ID;
SososCreateTask(SososIdleTask,SOSOS_RUNNING_TASK_PRI,SOSOS_RUNNING_TASK_ID,IDLE_TASK_STACK_SIZE,(void *)0);//創(chuàng)建idle任務(wù)
#if SOSOS_WDT_ENABLE == 1
//看門狗
wdt_enable(SOSOS_WDT_PERIOD);
SOSOS_WDT_RST();//復(fù)位看門狗
#endif
SYS_TIMER_INIT();
SP=TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STACK_POINT+SOSOS_PUSH_REGISTER_NO;
__asm__ __volatile__( "reti" "\n\t" );
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -