欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
牛人自制的STM32實(shí)時(shí)操作系統(tǒng)
[打印本頁(yè)]
作者:
IKNOW
時(shí)間:
2020-4-10 10:30
標(biāo)題:
牛人自制的STM32實(shí)時(shí)操作系統(tǒng)
作者
https://bbs.csdn.net/topics/300000723
實(shí)現(xiàn)硬件 STM32F10vet6
1,內(nèi)存使用量統(tǒng)計(jì)
硬件系統(tǒng)啟動(dòng)使用:
系統(tǒng)堆棧(系統(tǒng)啟動(dòng)的時(shí)候需要使用) 80個(gè)字節(jié)
操作系統(tǒng)內(nèi)核使用:
任務(wù)表 96+16個(gè)字節(jié)
注:20個(gè)字節(jié)/任務(wù) * 8(默認(rèn)任務(wù)個(gè)數(shù))
信號(hào)量 32個(gè)字節(jié)
注:4個(gè)字節(jié)/信號(hào)量 * 8(默認(rèn)信號(hào)量個(gè)數(shù))
消息隊(duì)列 54個(gè)字節(jié)
注: 默認(rèn)8條消息/隊(duì)列 * 3 (默認(rèn)3個(gè)消息隊(duì)列)
空閑任務(wù)(Idle) 96個(gè)字節(jié)
注:每個(gè)任務(wù)最少需要96個(gè)字節(jié)的堆棧,推薦256個(gè)字節(jié)
RAM使用統(tǒng)計(jì):
一個(gè)原始的系統(tǒng)總共占用內(nèi)存約為400個(gè)字節(jié)
其中內(nèi)核占用內(nèi)存不到300個(gè)字節(jié)
(注:根據(jù)armlink指示,另外還有96個(gè)字節(jié)的數(shù)據(jù)用于LIBSPACE.O文件,
這個(gè)查明,其實(shí)是開發(fā)環(huán)境在為main主函數(shù)初始化的時(shí)候用到)
2,代碼量(包括ROM里面的只讀數(shù)據(jù))統(tǒng)計(jì)
內(nèi)核 1200 個(gè)字節(jié)
信號(hào)量 300 個(gè)字節(jié)
消息隊(duì)列 500 個(gè)字節(jié)
ROM使用統(tǒng)計(jì)
原始的系統(tǒng)代碼小于2K
其中內(nèi)核代碼小于1.2K
單片機(jī)源程序如下:
#include "BenOSCore.h"
/*當(dāng)前OS中所有的任務(wù)*/
I8U TaskNUM=0;
TCB BenOSTCBTable[MAX_TASK_NUM];
/*當(dāng)前運(yùn)行的任務(wù)*/
TCB *BenOSCurTCB;
/*當(dāng)前準(zhǔn)備新運(yùn)行的任務(wù)*/
TCB *BenOSNewTCB;
I8U BenOSScheLock=0; /* 0 = enable */
/*無(wú)聊,所以把堆棧初始化模塊用匯編寫一遍,但愿性能會(huì)高點(diǎn)*/
__asm STACK_TYPE *BenOSTaskStkInit (void (*task),STACK_TYPE *ptos)
{
THUMB
PRESERVE8
PUSH {R4-R6,LR}
MOV R4,R0
MOV R0,R1
MOV R5,#0x1000000
STR R5,[R0,#0]
SUBS R0,R0,#4
STR R4,[R0,#0]
MVN R5,#1
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x2
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x3
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x4
SUBS R0,R0,#4
STR R5,[R0,#0]
ASRS R5,R5,#1
SUBS R0,R0,#4
STR R5,[R0,#0]
SUBS R0,R0,#4
STR R1,[R0,#0]
MOV R5,#0x5
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x6
SUBS R6,R0,#4
MOV R0,R6
STR R5,[R6,#0]
MOV R5,#0x7
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x8
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x8
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x10
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x11
SUBS R0,R0,#4
STR R5,[R0,#0]
MOV R5,#0x12
SUBS R6,R0,#4
MOV R0,R6
STR R5,[R6,#0]
POP {R4-R6,PC}
}
/*Thumb2指令集中無(wú)串操作指令,不過(guò)可以用字對(duì)齊進(jìn)行優(yōu)化*/
/*考慮到Thumb2指令中,32位指令執(zhí)行效率并不高,所以這里暫時(shí)不作優(yōu)化*/
void _mem_clr (I8U *pdest, I32 size)
{
while (size > 0) {
*pdest++ = (I8)0;
size--;
}
}
void _mem_copy (I8U *pdest, I8U *psrc, I16U size)
{
while (size > 0) {
*pdest++ = *psrc++;
size--;
}
}
/*在TCB表中取一個(gè)空閑的節(jié)點(diǎn),給新任務(wù)使用*/
/*對(duì)BenOSTCBTable表這個(gè)有序表進(jìn)行插入排序*/
/*將優(yōu)先級(jí)高的任務(wù)放在前面*/
TCB* BenOSGetFreeTCB(PRIORITY_TYPE prio)
{
TCB *pTCB;
I32 index=0,orgIndex;
pTCB = &(BenOSTCBTable[0]);
for (index = 0;index < TaskNUM+1;index++)
{
pTCB = BenOSTCBTable+index;
/*已經(jīng)是空閑TCB了,就直接使用*/
if (NULL == pTCB->pStackTop)
{
return (TCB*)pTCB;
}
/*若新任務(wù)優(yōu)先級(jí)比較低,則向后繼續(xù)找*/
if (pTCB->CurPriority >= prio)
{
continue;
}
else /*pTCB->CurPriority < prio 找到了該插入的位置了*/
{
/*保存當(dāng)前位置*/
orgIndex = index;
/*從當(dāng)前節(jié)點(diǎn)遍歷到最后一個(gè)使用了的節(jié)點(diǎn)*/
for( index = TaskNUM+1 ; index > orgIndex ; index-- )
{
pTCB = BenOSTCBTable+index;
/*將前一個(gè)節(jié)點(diǎn)的數(shù)據(jù),保存到當(dāng)前節(jié)點(diǎn)*/
_mem_copy((I8U *)(pTCB),(I8U *)(pTCB-1),sizeof(TCB));
}
_mem_clr((I8U *)(pTCB-1),sizeof(TCB)) ;
return (TCB*)(pTCB-1);
}
}
return (TCB*)NULL;
}
/*
*時(shí)鐘中斷函數(shù)
*/
void SysTick_Handler()
{
I8 index;
TCB *pTCB;
I8U flagFirstTask=0;
INT_Stat stat = 0;
stat = BenOS_INT_Save();
/*初始化*/
BenOSNewTCB = NULL;
/*禁止調(diào)度*/
if (BenOSScheLock != 0)
{
BenOS_INT_Restore(stat);
return;
}
for (index = 0;index < TaskNUM;index++)
{
pTCB = BenOSTCBTable+index;
/*該任務(wù)在睡眠狀態(tài),必須將所有時(shí)延都--*/
if (pTCB->TCBDelay > 0)
{
pTCB->TCBDelay--;
continue;
}
/*該任務(wù)被掛起*/
if (pTCB->TaskStat == BenOS_Task_Pend)
{
continue;
}
/*是否找到了應(yīng)該調(diào)度進(jìn)去的就緒任務(wù)*/
if (flagFirstTask==0)
{
/*找到了最高優(yōu)先級(jí)的任務(wù),
并且比當(dāng)前任務(wù)優(yōu)先級(jí)高*/
if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
{
flagFirstTask = 1;
BenOSNewTCB = pTCB;
continue;
}
/*找到了比當(dāng)前優(yōu)先級(jí)低的任務(wù)*/
if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
{
if (BenOSNewTCB == NULL)
{
flagFirstTask = 1;
BenOSNewTCB = pTCB;
continue ;
}
else
{
flagFirstTask = 1;
continue ;
}
}
/*找到了最高優(yōu)先級(jí)的任務(wù),
并且跟當(dāng)前任務(wù)優(yōu)先級(jí)相等*/
if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
{
/*該任務(wù)在當(dāng)前任務(wù)之后*/
if ((pTCB > BenOSCurTCB)||(pTCB == BenOSCurTCB))
{
flagFirstTask = 1;
BenOSNewTCB = pTCB;
continue ;
}
/*在當(dāng)前任務(wù)之前或者就是當(dāng)前任務(wù)
則還需要繼續(xù)向后搜索第一個(gè)同優(yōu)先級(jí)的任務(wù)*/
if ((pTCB < BenOSCurTCB)
&&(BenOSNewTCB == NULL))
{
BenOSNewTCB = pTCB;
continue;
}
}
continue;
}
}
if (BenOSNewTCB != BenOSCurTCB)
{
BenOSCtxSw();
}
BenOS_INT_Restore(stat);
}
/*
*在非中斷中 調(diào)度新的任務(wù) 并且切換
*/
void BenOSTaskSche()
{
INT_Stat stat = 0;
stat = BenOS_INT_Save();
if (BenOSScheLock != 0)
{
BenOS_INT_Restore(stat);
return;
}
if (BenOSNewTCB != BenOSCurTCB)
{
BenOSCtxSw();
}
BenOS_INT_Restore(stat);
}
/*
* 創(chuàng)建新的任務(wù)
*/
TASK_TYPE* BenOSCreateTask(void* task, STACK_TYPE *stack,PRIORITY_TYPE prio)
{
TCB *pTCB;
INT_Stat stat = 0;
stat = BenOS_INT_Save();
pTCB = BenOSGetFreeTCB(prio);
if (NULL == pTCB)
{
BenOS_INT_Restore(stat);
return NULL;
}
pTCB->pStackTop = BenOSTaskStkInit(task, stack);
pTCB->CurPriority = prio;
pTCB->TCBDelay = 0;
TaskNUM++;
BenOS_INT_Restore(stat);
return pTCB;
}
/*idle任務(wù)堆棧默認(rèn)為128個(gè)字節(jié)*/
STACK_TYPE idleStack[IDLE_TASK_STACK_SIZE];
I32U IdleConuter=0;
void BenOSIdleTask()
{
INT_Stat stat = 0;
while(1)
{
stat = BenOS_INT_Save();
IdleConuter++;
BenOS_INT_Restore(stat);
}
}
/*操作系統(tǒng)啟動(dòng)(并且將優(yōu)先級(jí)較低的IDLE任務(wù)創(chuàng)建)*/
void BenOSStart()
{
INT_Stat stat = 0;
stat = BenOS_INT_Save();
BenOSCurTCB = BenOSTCBTable;
if (BenOSCurTCB == NULL)
{
BenOS_INT_Restore(stat);
return;
}
BenOS_INT_Restore(stat);
BenOSCreateTask((void*)BenOSIdleTask,&idleStack[IDLE_TASK_STACK_SIZE-1],0);
BenOSStartTask();
}
void BenOSTimeDly (I32 ticks)
{
INT_Stat stat = 0;
I8 index;
TCB *pTCB;
stat = BenOS_INT_Save();
BenOSCurTCB->TCBDelay = ticks;
BenOSNewTCB = NULL;
/*從當(dāng)前任務(wù)向后遍歷,
第一個(gè)最大的優(yōu)先級(jí)的任務(wù)
就是需要調(diào)度進(jìn)去的任務(wù)*/
for (index = 0; index < TaskNUM;index++)
{
pTCB = BenOSTCBTable+index;
/*跳過(guò)睡眠任務(wù)*/
if (pTCB->TCBDelay != 0)
{
continue;
}
/*跳過(guò)掛起任務(wù)*/
if (pTCB->TaskStat == BenOS_Task_Pend)
{
continue;
}
/*找到了最高優(yōu)先級(jí)的任務(wù),
并且比當(dāng)前任務(wù)優(yōu)先級(jí)高*/
if (BenOSCurTCB->CurPriority < pTCB->CurPriority)
{
BenOSNewTCB = pTCB;
break;
}
/*找到了比當(dāng)前優(yōu)先級(jí)低的任務(wù)*/
if (BenOSCurTCB->CurPriority > pTCB->CurPriority)
{
/*如果當(dāng)前任務(wù)之前有同優(yōu)先級(jí)的就緒任務(wù),
則選擇該任務(wù),否則就使用*/
if (BenOSNewTCB == NULL)
{
BenOSNewTCB = pTCB;
}
break;
}
/*找到了最高優(yōu)先級(jí)的任務(wù),
并且跟當(dāng)前任務(wù)優(yōu)先級(jí)相等*/
if (BenOSCurTCB->CurPriority == pTCB->CurPriority)
{
/*該任務(wù)在當(dāng)前任務(wù)之后*/
if ((pTCB > BenOSCurTCB))
{
BenOSNewTCB = pTCB;
break ;
}
/*在當(dāng)前任務(wù)之前或者就是當(dāng)前任務(wù)
則還需要繼續(xù)向后搜索第一個(gè)同優(yōu)先級(jí)的任務(wù)*/
if (((pTCB < BenOSCurTCB)||(pTCB == BenOSCurTCB))
&&(BenOSNewTCB == NULL))
{
BenOSNewTCB = pTCB;
continue;
}
}
}
BenOS_INT_Restore(stat);
BenOSTaskSche();
}
/*
* 初始化任務(wù)數(shù)據(jù),并創(chuàng)建IDLE任務(wù)
*/
I8 BenOSInit()
{
I32 index=0;
INT_Stat stat = 0;
stat = BenOS_INT_Save();
for (index = 0;index < MAX_TASK_NUM;index++)
{
_mem_clr((I8U*)BenOSTCBTable,sizeof(TCB)*MAX_TASK_NUM);
}
for(index=0;index<MAX_SEM_NUM;index++)
{
BenOSSemaphore[index] = -1;
}
for (index=0;index<MAX_QUEUE_NUMBER;index++)
{
MsgQueueFlag[index]=0;
}
BenOSCurTCB = NULL;
BenOSNewTCB = NULL;
BenOS_INT_Restore(stat);
return BenOS_OK;
}
/*
* 恢復(fù)任務(wù)運(yùn)行
*/
void BenOSTaskResume(TASK_TYPE *task)
{
I32 index=0;
TCB *pTCB;
INT_Stat stat = 0;
stat = BenOS_INT_Save();
task->TaskStat = BenOS_Task_Run;
/*從頭向后遍歷,第一最大的優(yōu)先級(jí)就是需要調(diào)度進(jìn)去的任務(wù)*/
for (index = 0 ; index < TaskNUM;index++)
{
pTCB = BenOSTCBTable+index;
if ((pTCB->TCBDelay == 0) && (pTCB->TaskStat !=BenOS_Task_Pend) )
{
BenOSNewTCB = pTCB;
break;
}
}
BenOS_INT_Restore(stat);
BenOSTaskSche();
}
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
系統(tǒng).7z
(143.71 KB, 下載次數(shù): 75)
2020-4-10 13:20 上傳
點(diǎn)擊文件名下載附件
benOS
下載積分: 黑幣 -5
作者:
nsj21n
時(shí)間:
2020-4-11 08:29
大神級(jí),學(xué)習(xí)了!
作者:
HWL0541
時(shí)間:
2020-4-11 09:09
真是牛人,頂一下
作者:
smartphone
時(shí)間:
2020-4-12 12:26
看技術(shù)帖雖然一點(diǎn)都不懂 但是要頂
作者:
007.7
時(shí)間:
2021-6-11 17:40
從B站評(píng)論過(guò)來(lái)頂一下啊
作者:
act117
時(shí)間:
2023-4-20 10:06
B站來(lái)的,學(xué)習(xí)了
作者:
li64331218
時(shí)間:
2023-4-20 14:43
必須頂起啊!辛苦了
作者:
odddouglas
時(shí)間:
2024-7-16 15:40
頂, 前來(lái)學(xué)習(xí)觀望
作者:
huaishang
時(shí)間:
2024-7-16 16:41
大神級(jí),學(xué)習(xí)了!
作者:
sfd123
時(shí)間:
2024-7-19 07:26
厲害啊!膜拜一個(gè)!
作者:
Ubuntu312
時(shí)間:
2024-8-6 08:56
我看有人說(shuō)是從B站找過(guò)來(lái)的,請(qǐng)問(wèn)一下有視頻的鏈接嗎,能分享一下觀摩一二嗎。
作者:
西點(diǎn)鐘靈毓秀
時(shí)間:
2024-8-6 09:26
還是下載來(lái)看看,適不適合自己試用
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1