国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用C語言構(gòu)建一個(gè)獨(dú)立棧協(xié)程和共享?xiàng)f(xié)程的任務(wù)調(diào)度系統(tǒng)

這篇具有很好參考價(jià)值的文章主要介紹了使用C語言構(gòu)建一個(gè)獨(dú)立棧協(xié)程和共享?xiàng)f(xié)程的任務(wù)調(diào)度系統(tǒng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

使用了標(biāo)準(zhǔn)庫頭文件 <setjmp.h>中的 setjmplongjmp兩個(gè)函數(shù),構(gòu)建了一個(gè)簡(jiǎn)單的查詢式協(xié)作多任務(wù)系統(tǒng),支持獨(dú)立棧共享?xiàng)?/strong>兩種任務(wù)。

  1. 其中涉及到獲取和設(shè)置棧的地址操作,因此還需要根據(jù)不同平臺(tái)提供獲取和設(shè)置棧的地址操作(一般是匯編語言,因?yàn)樯婕暗郊拇嫫鳎?/li>
  2. 該調(diào)度系統(tǒng)僅運(yùn)行在一個(gè)實(shí)際的線程中,因此本質(zhì)上屬于協(xié)程
  3. 獨(dú)立棧任務(wù)都有自己獨(dú)立的運(yùn)行??臻g,互不干擾;共享?xiàng)H蝿?wù)共用一個(gè)運(yùn)行棧空間。

特點(diǎn)

  • 無任務(wù)優(yōu)先級(jí)搶占的功能。

  • 任務(wù)切換的時(shí)機(jī)完全取決于正在運(yùn)行的任務(wù),體現(xiàn)協(xié)作。

  • 支持獨(dú)立棧共享?xiàng)?/strong>兩種任務(wù),根據(jù)不同的應(yīng)用場(chǎng)景決定。

  • 查詢式的調(diào)度方式,當(dāng)前任務(wù)切換時(shí),查詢下個(gè)任務(wù)是否需要執(zhí)行。

  • 移植性強(qiáng),只需要修改設(shè)置棧和獲取當(dāng)前棧地址的宏即可。

  • 相對(duì)于時(shí)間片論法的任務(wù)調(diào)度來說,查詢式協(xié)作多任務(wù)系統(tǒng)有以下特點(diǎn):

    • 無需使用定時(shí)器做為任務(wù)調(diào)度
    • 每個(gè)任務(wù)都可以使用while循環(huán),用于執(zhí)行任務(wù)并保持程序的運(yùn)行,程序結(jié)構(gòu)清晰
    • 每個(gè)任務(wù)都可以隨時(shí)阻塞等待,甚至可以在嵌套的子函數(shù)中阻塞等待
    • 通過阻塞等待,無需使用狀態(tài)機(jī)等較為復(fù)雜的方式來優(yōu)化縮減每個(gè)任務(wù)的執(zhí)行時(shí)長(zhǎng)
  • 相對(duì)于RTOS操作系統(tǒng)來說,查詢式協(xié)作多任務(wù)系統(tǒng)有以下特點(diǎn):

    • 沒有任務(wù)優(yōu)先級(jí)搶占式的功能,因此臨界資源(中斷除外)和優(yōu)先級(jí)反轉(zhuǎn)的問題也不存在
    • 允許用戶或應(yīng)用程序根據(jù)需要自由地切換到下一個(gè)就緒任務(wù)
    • 通過自主調(diào)度和管理任務(wù),查詢式協(xié)作多任務(wù)系統(tǒng)可以提高工作效率
    • 沒有操作系統(tǒng)的復(fù)雜

功能設(shè)計(jì)

運(yùn)行棧空間:程序運(yùn)行中發(fā)生函數(shù)調(diào)用等情況需要使用的棧內(nèi)存空間

獨(dú)立棧任務(wù)(有棧任務(wù))

每個(gè)獨(dú)立棧任務(wù)都擁有自己獨(dú)立的運(yùn)行??臻g,可以隨時(shí)隨地阻塞等待,保存上下文后切換到下一個(gè)任務(wù)執(zhí)行

獨(dú)立棧任務(wù)在切換下一個(gè)任務(wù)時(shí),不會(huì)操作運(yùn)行棧,只對(duì)上下文切換

共享?xiàng)H蝿?wù)(無棧任務(wù))

每個(gè)共享?xiàng)H蝿?wù)都沒有自己獨(dú)立的運(yùn)行??臻g,雖然也能阻塞等待,但是僅限于在任務(wù)入口函數(shù)中使用,禁止在任務(wù)的子函數(shù)(嵌套函數(shù))中阻塞等待;并且在該任務(wù)入口函數(shù)中不建議定義相關(guān)變量。

  • 每個(gè)任務(wù)有自己的獨(dú)立備份棧(用來備份運(yùn)行棧的棧頂部分?jǐn)?shù)據(jù));運(yùn)行棧通常比備份棧要大很多,否則任務(wù)函數(shù)無法正常運(yùn)行多級(jí)嵌套的函數(shù)
  • 共享?xiàng)H蝿?wù)在切換下一個(gè)任務(wù)時(shí)會(huì)將當(dāng)前運(yùn)行棧(共享?xiàng)#┨崆霸O(shè)置好的備份棧大小(宏配置)拷貝到內(nèi)存?zhèn)浞萜饋?,等下次即將?zhí)行時(shí)再從內(nèi)存中拷貝到運(yùn)行棧(共享?xiàng)#┻M(jìn)行恢復(fù)
  • 通過修改加大備份棧大?。ê昱渲茫┑闹?,可以在共享?xiàng)H蝿?wù)入口函數(shù)定義變量,這樣可以避免這些變量的值沒有備份導(dǎo)致丟失,或者通過 static 定義局部變量
  • 該類型任務(wù)適合于輕量的任務(wù)處理,一般都是調(diào)用封裝好的函數(shù)即可

注:這里的共享?xiàng)H蝿?wù)和常規(guī)的實(shí)現(xiàn)有一些差異,常規(guī)的實(shí)現(xiàn)是使用堆申請(qǐng)內(nèi)存保存棧的數(shù)據(jù),用多少申請(qǐng)多少進(jìn)行保存,而這里的實(shí)現(xiàn)僅僅保存了一部分?jǐn)?shù)據(jù)。

任務(wù)創(chuàng)建

  1. 在調(diào)度系統(tǒng)啟動(dòng)前,至少要先創(chuàng)建一個(gè)任務(wù),否則直接退出
  2. 可以在任務(wù)中創(chuàng)建新的任務(wù),不管是獨(dú)立棧任務(wù)還是共享?xiàng)H蝿?wù)
    • 獨(dú)立棧任務(wù)中可以創(chuàng)建新的獨(dú)立棧任務(wù)和共享?xiàng)H蝿?wù)
    • 共享?xiàng)H蝿?wù)中同樣可以創(chuàng)建新的獨(dú)立棧任務(wù)和共享?xiàng)H蝿?wù),而且在創(chuàng)建共享?xiàng)H蝿?wù)時(shí)可以使用同一個(gè)共享?xiàng)?/li>
  3. 獨(dú)立棧任務(wù)和共享?xiàng)H蝿?wù)一共可以創(chuàng)建最多32個(gè)任務(wù)(需要修改宏配置)

任務(wù)銷毀

  • 沒有提供該功能接口函數(shù),任務(wù)入口函數(shù)主動(dòng)退出則自動(dòng)將任務(wù)銷毀。
  • 可以通過等待任務(wù)退出接口函數(shù)在其他任務(wù)中等待該任務(wù)退出。

任務(wù)阻塞

當(dāng)前任務(wù)阻塞提供兩種方式:

  • 時(shí)間阻塞:需要阻塞多長(zhǎng)時(shí)間,等時(shí)間滿足后才會(huì)繼續(xù)執(zhí)行
  • 事件阻塞:通過事件阻塞,只有事件觸發(fā)后才會(huì)繼續(xù)執(zhí)行

使用說明

任務(wù)創(chuàng)建/退出

對(duì)于創(chuàng)建獨(dú)立棧任務(wù)還是共享?xiàng)H蝿?wù)的示例代碼:


uint8_t g_task1Stack[1024 * 2];
uint8_t g_task2Stack[1024 * 2];
uint8_t g_task3Stack[1024 * 2];

uint8_t g_sharedStack[1024 * 2];

// 執(zhí)行完成就退出的任務(wù)
void taskfunc3(int arg)
{
    ...
    cotOs_Wait(1000);
    ...
    cotOs_Wait(1000);
}

void taskfunc1(int arg)
{
   /* 不管taskfunc1是獨(dú)立棧任務(wù)還是共享?xiàng)H蝿?wù),都支持創(chuàng)建子任務(wù) */
   cotOs_CreatTask(taskfunc3, COT_OS_UNIQUE_STACK, g_task3Stack, sizeof(g_task3Stack), 0);  // 創(chuàng)建獨(dú)立棧任務(wù)
   cotOs_CreatTask(taskfunc3, COT_OS_SHARED_STACK, g_sharedStack, sizeof(g_sharedStack), 0); // 創(chuàng)建共享?xiàng)H蝿?wù)

    while (1)
    {
        ...
        cotOs_Wait(1000);
    }
}

void taskfunc2(int arg)
{
    while (1)
    {
        ...
        cotOs_Wait(10);
    }
}

int main(void)
{
    cotOs_Init(GetTimerMs);
#if 0
    /* 創(chuàng)建獨(dú)立棧任務(wù) */
    cotOs_CreatTask(taskfunc1, COT_OS_UNIQUE_STACK, g_task1Stack, sizeof(g_task1Stack), 0);
    cotOs_CreatTask(taskfunc2, COT_OS_UNIQUE_STACK, g_task2Stack, sizeof(g_task2Stack), 0);
#else
    /* 創(chuàng)建共享?xiàng)H蝿?wù) */
    cotOs_CreatTask(taskfunc1, COT_OS_SHARED_STACK, g_sharedStack, sizeof(g_sharedStack), 0);
    cotOs_CreatTask(taskfunc2, COT_OS_SHARED_STACK, g_sharedStack, sizeof(g_sharedStack), 0);
#endif
    cotOs_Start();
}

任務(wù)限制

對(duì)于創(chuàng)建獨(dú)立棧任務(wù)還是共享?xiàng)H蝿?wù),共享?xiàng)H蝿?wù)有限制要求,禁止在任務(wù)入口函數(shù)的嵌套函數(shù)中阻塞


uint8_t g_task1Stack[1024 * 2];
uint8_t g_sharedStack[1024 * 2];

void func1_1(void)
{
    ...
    cotOs_Wait(1000);
    ...
    cotOs_Wait(1000);
}

/* 獨(dú)立棧任務(wù) */
void taskfunc1(int arg)
{
    int arr[10];   // 可以直接定義變量使用

    while (1)
    {
        func1_1();  // 可以在嵌套函數(shù)中使用阻塞等待
        ...
        cotOs_Wait(1000);
    }
}

void func2_1(void)
{
    ...
}

/* 共享?xiàng)H蝿?wù) */
void taskfunc2(int arg)
{
    static int arr[10];  // 建議使用static定義任務(wù)內(nèi)變量或者不定義變量

    while (1)
    {
        func2_1();  // 禁止在嵌套函數(shù)中使用阻塞等待
        ...
        cotOs_Wait(10);
    }
}

int main(void)
{
    cotOs_Init(GetTimerMs);

    /* 創(chuàng)建獨(dú)立棧任務(wù) */
    cotOs_CreatTask(taskfunc1, COT_OS_UNIQUE_STACK, g_task1Stack, sizeof(g_task1Stack), 0);

    /* 創(chuàng)建共享?xiàng)H蝿?wù) */
    cotOs_CreatTask(taskfunc2, COT_OS_SHARED_STACK, g_sharedStack, sizeof(g_sharedStack), 0);

    cotOs_Start();
}

任務(wù)阻塞/退出

通過時(shí)間和事件的方式阻塞


uint8_t g_task1Stack[1024 * 2];
uint8_t g_task2Stack[1024 * 2];
uint8_t g_task3Stack[1024 * 2];

uint8_t g_sharedStack[1024 * 2];

CotOSCondition_t g_eventCv;

// 執(zhí)行完成就退出的任務(wù)
void taskfunc3(int arg)
{
    ...
    cotOs_ConditionWait(&g_eventCv);
    ...
}

void taskfunc1(int arg)
{
   cotOsTask_t task = cotOs_CreatTask(taskfunc3, COT_OS_UNIQUE_STACK, g_task3Stack, sizeof(g_task3Stack), 0);

    while (1)
    {
        ...
        cotOs_Wait(1000);

        if (...)
        {
            // 等待 taskfunc3 任務(wù)運(yùn)行結(jié)束后才退出 taskfunc1
            cotOs_Join(task);
            break;
        }
    }
}

void taskfunc2(int arg)
{
    while (1)
    {
        ...
        cotOs_Wait(10);

        if (...)
        {
            cotOs_ConditionNotify(&g_eventCv);  // 通知 taskfunc3 繼續(xù)執(zhí)行
        }
    }
}

int main(void)
{
    cotOs_Init(GetTimerMs);
    cotOs_CreatTask(taskfunc1, COT_OS_SHARED_STACK, g_sharedStack, sizeof(g_sharedStack), 0);
    cotOs_CreatTask(taskfunc2, COT_OS_SHARED_STACK, g_sharedStack, sizeof(g_sharedStack), 0);

    cotOs_Start();
}

不同棧類型任務(wù)應(yīng)用場(chǎng)景

  • 獨(dú)立棧任務(wù)(有棧任務(wù))

    • 重量級(jí)任務(wù): 提供更多的控制,適用于需要更精確地管理任務(wù)狀態(tài)的情況和執(zhí)行計(jì)算密集型任務(wù)的場(chǎng)景
    • 更可預(yù)測(cè)的內(nèi)存使用: 在創(chuàng)建時(shí)分配??臻g,可以更好地控制內(nèi)存使用,適用于需要更可預(yù)測(cè)內(nèi)存行為的場(chǎng)景
    • 遞歸調(diào)用: 更容易處理遞歸調(diào)用,因?yàn)槊總€(gè)任務(wù)都有獨(dú)立的??臻g
  • 共享?xiàng)H蝿?wù)(無棧任務(wù))

    • 輕量級(jí)任務(wù): 通常更輕量,適用于大量小任務(wù)的場(chǎng)景。
    • 內(nèi)存效率: 適用于內(nèi)存受限的環(huán)境,因?yàn)椴恍枰獮槊總€(gè)任務(wù)分配各自的??臻g(備份棧除外)。

代碼鏈接

cot_os文章來源地址http://www.zghlxwxcb.cn/news/detail-825386.html

到了這里,關(guān)于使用C語言構(gòu)建一個(gè)獨(dú)立棧協(xié)程和共享?xiàng)f(xié)程的任務(wù)調(diào)度系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • unity 等待事件之協(xié)程和Invoke

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: 協(xié)程的用法 和 Invoke 的等待事件使用 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 代碼如下(示例): 好記性不如爛筆頭!

    2024年04月13日
    瀏覽(28)
  • 【Unity每日一記】“調(diào)皮的協(xié)程”,協(xié)程和多線程的區(qū)別在哪里

    【Unity每日一記】“調(diào)皮的協(xié)程”,協(xié)程和多線程的區(qū)別在哪里

    ?????個(gè)人主頁 :@元宇宙-秩沅 ????? hallo 歡迎 點(diǎn)贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專欄 : unity每日一記 ?【軟件設(shè)計(jì)師高頻考點(diǎn)暴擊】 ?【Unityc#專題篇】之c#系統(tǒng)化大禮包】 ?【unity數(shù)據(jù)持久化】數(shù)據(jù)管理類_PlayerPrfs ?【u

    2024年02月05日
    瀏覽(55)
  • 淺談Lua協(xié)程和函數(shù)的尾調(diào)用

    淺談Lua協(xié)程和函數(shù)的尾調(diào)用

    雖然不經(jīng)常用到協(xié)程,但是也不能談虎色變。同時(shí),在有些場(chǎng)景,協(xié)程會(huì)起到一種不可比擬的作用。所以,了解它,對(duì)于一些功能,也會(huì)有獨(dú)特的思路和想法。 概念 關(guān)于進(jìn)程和線程的概念就不多說。 那么從多線程的角度來看,協(xié)程和線程有點(diǎn)類似:擁有自己的棧,局部變量

    2024年02月10日
    瀏覽(15)
  • unity協(xié)程 Start/StopCoroutine() 結(jié)束協(xié)程和再次啟動(dòng)協(xié)程存在的問題和解決方案

    unity協(xié)程 Start/StopCoroutine() 結(jié)束協(xié)程和再次啟動(dòng)協(xié)程存在的問題和解決方案

    僅用于記錄遇到的問題和解決方案。 快速閱覽: 一、結(jié)束協(xié)程無效: 協(xié)程方法需要單獨(dú)存一份private IEnumerator myTest,再開始和結(jié)束不直接傳入方法名,而是使用這份保存的myTest進(jìn)行開始和結(jié)束。 二、再次開啟協(xié)程時(shí)少跑了幾行代碼: 再次開始同一個(gè)方法名的協(xié)程時(shí),不是從

    2024年02月15日
    瀏覽(25)
  • pytorch 40 分享從0開始構(gòu)建一個(gè)獨(dú)立的深度學(xué)習(xí)項(xiàng)目

    都2023年了,估計(jì)沒有幾個(gè)人會(huì)自己獨(dú)立從0開始構(gòu)建深度學(xué)習(xí)項(xiàng)目的了,全是依賴現(xiàn)有的開源庫進(jìn)行項(xiàng)目研制開發(fā)。這里回顧幾年的工作經(jīng)驗(yàn),對(duì)構(gòu)建深度學(xué)習(xí)項(xiàng)目進(jìn)行初步梳理。 通常深度學(xué)習(xí)任務(wù)都被描述為:假設(shè)函數(shù)、損失函數(shù)和迭代函數(shù)。假設(shè)函數(shù)一般是我們的模型,

    2024年02月09日
    瀏覽(25)
  • 在51單片機(jī)中使用一個(gè)獨(dú)立按鍵控制流水燈方向

    用獨(dú)立按鍵控制流水燈轉(zhuǎn)向,按下獨(dú)立按鍵流水燈向右移動(dòng),再按下獨(dú)立按鍵流水燈向左移動(dòng) 此代碼用到 邏輯左移:_crol_(移動(dòng)對(duì)象,移動(dòng)的位數(shù)) 邏輯右移:_cror_(移動(dòng)對(duì)象,移動(dòng)的位數(shù))

    2024年02月07日
    瀏覽(21)
  • 如何用大語言模型構(gòu)建一個(gè)知識(shí)問答系統(tǒng)

    如何用大語言模型構(gòu)建一個(gè)知識(shí)問答系統(tǒng)

    打造? 特定領(lǐng)域知識(shí)(Domain-specific Knowledge) ? 問答 ?系統(tǒng),具體需求有: 通過自然語言問答的形式,和用戶交互,同時(shí)支持中文和英文。 理解用戶不同形式的問題,找到與之匹配的答案。可以對(duì)答案進(jìn)行二次處理,比如將關(guān)聯(lián)的多個(gè)知識(shí)點(diǎn)進(jìn)行去重、匯總等。 支持上下文。有

    2024年02月09日
    瀏覽(23)
  • 用C語言構(gòu)建一個(gè)手寫數(shù)字識(shí)別神經(jīng)網(wǎng)絡(luò)

    用C語言構(gòu)建一個(gè)手寫數(shù)字識(shí)別神經(jīng)網(wǎng)絡(luò)

    (原理和程序基本框架請(qǐng)參見前一篇 \\\"用C語言構(gòu)建了一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)路\\\") 1.準(zhǔn)備訓(xùn)練和測(cè)試數(shù)據(jù)集 從http://yann.lecun.com/exdb/mnist/下載手寫數(shù)字訓(xùn)練數(shù)據(jù)集, 包括圖像數(shù)據(jù)train-images-idx3-ubyte.gz 和標(biāo)簽數(shù)據(jù) train-labels-idx1-ubyte.gz. 分別將他們解壓后放在本地文件夾中,解壓后文件名

    2024年02月14日
    瀏覽(23)
  • 用C語言構(gòu)建一個(gè)數(shù)字識(shí)別卷積神經(jīng)網(wǎng)絡(luò)

    用C語言構(gòu)建一個(gè)數(shù)字識(shí)別卷積神經(jīng)網(wǎng)絡(luò)

    ?卷積神經(jīng)網(wǎng)絡(luò)的具體原理和對(duì)應(yīng)的python例子參見末尾的參考資料2.3. 這里僅敘述卷積神經(jīng)網(wǎng)絡(luò)的配置, 其余部分不做贅述,構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)的具體步驟請(qǐng)參見上一篇: 用C語言構(gòu)建一個(gè)手寫數(shù)字識(shí)別神經(jīng)網(wǎng)路 卷積網(wǎng)絡(luò)同樣采用簡(jiǎn)單的三層結(jié)構(gòu),包括輸入層conv_layer,中間層

    2024年02月14日
    瀏覽(22)
  • 用C語言構(gòu)建一個(gè)數(shù)字識(shí)別深度神經(jīng)網(wǎng)絡(luò)

    用C語言構(gòu)建一個(gè)數(shù)字識(shí)別深度神經(jīng)網(wǎng)絡(luò)

    接上一篇: 用C語言構(gòu)建一個(gè)數(shù)字識(shí)別卷積神經(jīng)網(wǎng)絡(luò) 1. 深度神經(jīng)網(wǎng)絡(luò) 按照深度學(xué)習(xí)的理論,隨著神經(jīng)網(wǎng)絡(luò)層數(shù)的增加,網(wǎng)絡(luò)擬合復(fù)雜問題的能力也會(huì)增強(qiáng),對(duì)事物特征的挖掘也會(huì)更加深入.這里嘗試構(gòu)建一個(gè)5層深度的神經(jīng)網(wǎng)絡(luò),包括兩個(gè)卷積層和兩個(gè)池化層, 其中輸出層為全

    2024年02月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包