0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

cola_os的分析及使用

我快閉嘴 ? 來(lái)源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2022-08-12 09:37 ? 次閱讀

正文


本期主角:cola_os

cola_os是一個(gè)300多行代碼實(shí)現(xiàn)的多任務(wù)管理的OS,在很多MCU開(kāi)發(fā)中,功能很簡(jiǎn)單,實(shí)時(shí)性要求不強(qiáng),任務(wù)多了管理不當(dāng)又很亂。

如果使用RTOS顯得太浪費(fèi),這時(shí)候可以嘗試使用使用cola_os這類(lèi)基于軟件定時(shí)器實(shí)現(xiàn)的時(shí)間片輪詢(xún)框架。

倉(cāng)庫(kù)鏈接:

https://gitee.com/schuck/cola_os

license:MulanPSL-1.0(木蘭寬松許可證, 第1版)。

cola_os是一份簡(jiǎn)潔明了的代碼,包含很多有用的編程思想,值得通讀。下面我們一起來(lái)學(xué)習(xí)一下:

cola_os的分析及使用

其實(shí)關(guān)于cola_os其實(shí)我們前幾天的推文中也有做介紹。今天我們?cè)僖黄饋?lái)完整地梳理一遍。

cola_os目前的內(nèi)容如:

d72d7110-1971-11ed-ba43-dac502259ad0.pngd73c46fe-1971-11ed-ba43-dac502259ad0.png

1、cola_os

cola_os就是cola_os的任務(wù)管理模塊。任務(wù)使用鏈表進(jìn)行管理,其數(shù)據(jù)結(jié)構(gòu)如:

typedefvoid(*cbFunc)(uint32_tevent);

typedefstructtask_s
{
uint8_ttimerNum;//定時(shí)編號(hào)
uint32_tperiod;//定時(shí)周期
booloneShot;//true只執(zhí)行一次
boolstart;//開(kāi)始啟動(dòng)
uint32_ttimerTick;//定時(shí)計(jì)數(shù)
boolrun;//任務(wù)運(yùn)行標(biāo)志
booltaskFlag;//任務(wù)標(biāo)志是主任務(wù)還是定時(shí)任務(wù)
uint32_tevent;//驅(qū)動(dòng)事件
cbFuncfunc;//回調(diào)函數(shù)
structtask_s*next;
}task_t;

每創(chuàng)建一個(gè)任務(wù)嗎,就是往任務(wù)鏈表中插入一個(gè)任務(wù)節(jié)點(diǎn)。

其創(chuàng)建任務(wù)的方法有兩種:

  • 創(chuàng)建主循環(huán)任務(wù)
  • 創(chuàng)建定時(shí)任務(wù)

兩種方式創(chuàng)建,都是會(huì)在while(1)循環(huán)中調(diào)度執(zhí)行任務(wù)函數(shù)。

我們可以看看cola_task_loop任務(wù)遍歷函數(shù),這個(gè)函數(shù)最終是要放在主函數(shù)while(1)中調(diào)用的。其內(nèi)容如:

voidcola_task_loop(void)
{
uint32_tevents;
task_t*cur=task_list;
OS_CPU_SRcpu_sr;

while(cur!=NULL)
{
if(cur->run)
{
if(NULL!=cur->func)
{
events=cur->event;
if(events)
{
enter_critical();
cur->event=0;
exit_critical();
}
cur->func(events);
}
if(TASK_TIMER==cur->taskFlag)
{
enter_critical();
cur->run=false;
exit_critical();
}
if((cur->oneShot)&&(TASK_TIMER==cur->taskFlag))
{
cur->start=false;
}
}
cur=cur->next;
}
}

兩種方式創(chuàng)建的任務(wù)都會(huì)在cur->func(events);被調(diào)用。不同的就是:遍歷執(zhí)行到定時(shí)任務(wù)時(shí),需要清掉定時(shí)相關(guān)標(biāo)志。

其中,events作為任務(wù)函數(shù)的參數(shù)傳入。從cola_task_loop可以看到,事件并未使用到,events無(wú)論真還是假,在執(zhí)行任務(wù)函數(shù)前,都被清零了。events的功能應(yīng)該是作者預(yù)留的。

創(chuàng)建任務(wù)很簡(jiǎn)單,比如創(chuàng)建一個(gè)定時(shí)任務(wù):

statictask_ttimer_500ms;

//每500ms執(zhí)行一次
staticvoidtimer_500ms_cb(uint32_tevent)
{
printf("task0running...
");
}

cola_timer_create(&timer_500ms,timer_500ms_cb);
cola_timer_start(&timer_500ms,TIMER_ALWAYS,500);

cola_os是基于軟件定時(shí)器來(lái)進(jìn)行任務(wù)調(diào)度管理的,需要一個(gè)硬件定時(shí)器提供時(shí)基。比如使用系統(tǒng)滴答定時(shí)器,配置為1ms中斷一次。

在1ms中斷中不斷輪詢(xún)判斷定時(shí)計(jì)數(shù)是否到達(dá)定時(shí)時(shí)間:

voidSysTick_Handler(void)
{
cola_timer_ticker();
}

voidcola_timer_ticker(void)
{
task_t*cur=task_list;
OS_CPU_SRcpu_sr;
while(cur!=NULL)
{
if((TASK_TIMER==cur->taskFlag)&&cur->start)
{
if(++cur->timerTick>=cur->period)
{
cur->timerTick=0;
if(cur->func!=NULL)
{
enter_critical();
cur->run=true;
exit_critical();
}
}
}
cur=cur->next;
}
}

如果到了則將標(biāo)志cur->run置位,在while大循環(huán)中的cola_task_loop函數(shù)中如果檢測(cè)到該標(biāo)志就執(zhí)行該任務(wù)函數(shù)。

2、cola_device

cola_device是硬件抽象層,使用鏈表來(lái)管理各個(gè)設(shè)備。其借鑒了RT-ThreadLinux相關(guān)驅(qū)動(dòng)框架思想。大致內(nèi)容如:

數(shù)據(jù)結(jié)構(gòu)如:

typedefstructcola_devicecola_device_t;

structcola_device_ops
{
int(*init)(cola_device_t*dev);
int(*open)(cola_device_t*dev,intoflag);
int(*close)(cola_device_t*dev);
int(*read)(cola_device_t*dev,intpos,void*buffer,intsize);
int(*write)(cola_device_t*dev,intpos,constvoid*buffer,intsize);
int(*control)(cola_device_t*dev,intcmd,void*args);

};

structcola_device
{
constchar*name;
structcola_device_ops*dops;
structcola_device*next;
};

硬件抽象層的接口如:

/*
驅(qū)動(dòng)注冊(cè)
*/
intcola_device_register(cola_device_t*dev);
/*
驅(qū)動(dòng)查找
*/
cola_device_t*cola_device_find(constchar*name);
/*
驅(qū)動(dòng)讀
*/
intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize);
/*
驅(qū)動(dòng)寫(xiě)
*/
intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize);
/*
驅(qū)動(dòng)控制
*/
intcola_device_ctrl(cola_device_t*dev,intcmd,void*arg);

首先,在驅(qū)動(dòng)層注冊(cè)好設(shè)備,把操作設(shè)備的函數(shù)指針及設(shè)備名稱(chēng)插入到設(shè)備鏈表中:

staticcola_device_tled_dev;

staticvoidled_gpio_init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=PIN_GREENLED;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(PORT_GREEN_LED,&GPIO_InitStructure);
LED_GREEN_OFF;
}

staticintled_ctrl(cola_device_t*dev,intcmd,void*args)
{
if(LED_TOGGLE==cmd)
{
LED_GREEN_TOGGLE;
}
else
{

}
return1;
}


staticstructcola_device_opsops=
{
.control=led_ctrl,
};

staticvoidled_register(void)
{
led_gpio_init();
led_dev.dops=&ops;
led_dev.name="led";
cola_device_register(&led_dev);
}

cola_device_register函數(shù)如:

intcola_device_register(cola_device_t*dev)
{
if((NULL==dev)||(cola_device_is_exists(dev)))
{
return0;
}

if((NULL==dev->name)||(NULL==dev->dops))
{
return0;
}
returndevice_list_inster(dev);
}

驅(qū)動(dòng)注冊(cè)好設(shè)備之后,應(yīng)用層就可以根據(jù)設(shè)備名稱(chēng)來(lái)查找設(shè)備是否被注冊(cè),如果已經(jīng)注冊(cè)則可以調(diào)用設(shè)備操作接口操控設(shè)備。比如創(chuàng)建一個(gè)定時(shí)任務(wù)定時(shí)反轉(zhuǎn)led:

voidapp_init(void)
{
app_led_dev=cola_device_find("led");
assert(app_led_dev);
cola_timer_create(&timer_500ms,timer_500ms_cb);
cola_timer_start(&timer_500ms,TIMER_ALWAYS,500);
}

staticvoidtimer_500ms_cb(uint32_tevent)
{
cola_device_ctrl(app_led_dev,LED_TOGGLE,0);
}

3、cola_init

cola_init是一個(gè)自動(dòng)初始化模塊,模仿Linux的initcall機(jī)制。RT-Thread也有實(shí)現(xiàn)這個(gè)功能:

d74db22c-1971-11ed-ba43-dac502259ad0.png

一般的,我們的初始化在主函數(shù)中調(diào)用,如:

d761ebac-1971-11ed-ba43-dac502259ad0.png

有了自動(dòng)初始化模塊,可以不在主函數(shù)中調(diào)用,例如:

voidSystemClock_Config(void)
{
}
pure_initcall(SystemClock_Config);

這樣也可以調(diào)用SystemClock_Config。pure_initcall如:

#define__used__attribute__((__used__))

typedefvoid(*initcall_t)(void);

#define__define_initcall(fn,id)
staticconstinitcall_t__initcall_##fn##id__used
__attribute__((__section__("initcall"#id"init")))=fn;

#definepure_initcall(fn)__define_initcall(fn,0)//可用作系統(tǒng)時(shí)鐘初始化
#definefs_initcall(fn)__define_initcall(fn,1)//tick和調(diào)試接口初始化
#definedevice_initcall(fn)__define_initcall(fn,2)//驅(qū)動(dòng)初始化
#definelate_initcall(fn)__define_initcall(fn,3)//其他初始化

在cola_init中,首先是調(diào)用不同順序級(jí)別的__define_initcall宏來(lái)把函數(shù)指針fn放入到自定義的指定的段中。各個(gè)需要自動(dòng)初始化的函數(shù)放到指定的段中,形成一張初始化函數(shù)表。

__ attribute __ (( __ section __)) 關(guān)鍵字就是用來(lái)指定數(shù)據(jù)存放段。

do_init_call函數(shù)在我們程序起始時(shí)調(diào)用,比如在bsp_init中調(diào)用:

voidbsp_init(void)
{
do_init_call();
}

do_init_call里做的事情就是遍歷初始化函數(shù)表里的函數(shù):

voiddo_init_call(void)
{
externinitcall_tinitcall0init$$Base[];
externinitcall_tinitcall0init$$Limit[];
externinitcall_tinitcall1init$$Base[];
externinitcall_tinitcall1init$$Limit[];
externinitcall_tinitcall2init$$Base[];
externinitcall_tinitcall2init$$Limit[];
externinitcall_tinitcall3init$$Base[];
externinitcall_tinitcall3init$$Limit[];

initcall_t*fn;

for(fn=initcall0init$$Base;
fnif(fn)
(*fn)();
}

for(fn=initcall1init$$Base;
fnif(fn)
(*fn)();
}

for(fn=initcall2init$$Base;
fnif(fn)
(*fn)();
}

for(fn=initcall3init$$Base;
fnif(fn)
(*fn)();
}
}

這里有 initcall0init $$ Baseinitcall0init Limit這幾個(gè)initcall_t類(lèi)型的函數(shù)指針數(shù)組的聲明。它們事先是調(diào)用__define_initcall把函數(shù)指針fn放入到自定義的指定的段.initcall0init、.initcall1init、.initcall2init、.initcall3init。

initcall0init$$Baseinitcall0init$$Limit按照我的理解就是各個(gè)初始化函數(shù)表的開(kāi)始及結(jié)束地址。從而實(shí)現(xiàn)遍歷:

for(fn=initcall0init$$Base;
fnif(fn)
(*fn)();
}

例如RT-Thread里的實(shí)現(xiàn)也是類(lèi)似的:

volatileconstinit_fn_t*fn_ptr;

for(fn_ptr=&__rt_init_rti_board_start;fn_ptr

關(guān)于init自動(dòng)初始化機(jī)制大致就分析這些。

cola_os包含有cola_os任務(wù)管理、cola_device硬件抽象層及cola_init自動(dòng)初始化三大塊,這三塊內(nèi)容其實(shí)可以單獨(dú)抽出來(lái)學(xué)習(xí)、使用。

4、cola_os的使用

下面我們基于小熊派IOT開(kāi)發(fā)板來(lái)簡(jiǎn)單實(shí)踐實(shí)踐。

d7732c0a-1971-11ed-ba43-dac502259ad0.png

我們創(chuàng)建兩個(gè)定時(shí)任務(wù):

  • task0任務(wù):定時(shí)500ms打印一次。
  • task1任務(wù):定時(shí)1000ms打印一次。

main.c:

/*Privatevariables---------------------------------------------------------*/
statictask_ttimer_500ms;
statictask_ttimer_1000ms;
/*USERCODEENDPV*/

/*Privatefunctionprototypes-----------------------------------------------*/
voidSystemClock_Config(void);

/*USERCODEBEGINPFP*/
/*Privatefunctionprototypes-----------------------------------------------*/

/*USERCODEENDPFP*/

/*USERCODEBEGIN0*/

//每500ms執(zhí)行一次
staticvoidtimer_500ms_cb(uint32_tevent)
{
printf("task0running...
");
}

//每1000ms執(zhí)行一次
staticvoidtimer_1000ms_cb(uint32_tevent)
{
printf("task1running...
");
}

intmain(void)
{
/*USERCODEBEGIN1*/

/*USERCODEEND1*/

/*MCUConfiguration----------------------------------------------------------*/

/*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/
HAL_Init();

/*USERCODEBEGINInit*/

/*USERCODEENDInit*/

/*Configurethesystemclock*/
//SystemClock_Config();

/*USERCODEBEGINSysInit*/

/*USERCODEENDSysInit*/

/*Initializeallconfiguredperipherals*/
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/*USERCODEBEGIN2*/
printf("微信公眾號(hào):嵌入式大雜燴
");
printf("cola_ostest!
");

cola_timer_create(&timer_500ms,timer_500ms_cb);
cola_timer_start(&timer_500ms,TIMER_ALWAYS,500);
cola_timer_create(&timer_1000ms,timer_1000ms_cb);
cola_timer_start(&timer_1000ms,TIMER_ALWAYS,1000);

/*USERCODEEND2*/

/*Infiniteloop*/
/*USERCODEBEGINWHILE*/
while(1)
{

/*USERCODEENDWHILE*/

/*USERCODEBEGIN3*/
cola_task_loop();
}
/*USERCODEEND3*/

}

/**
*@briefSystemClockConfiguration
*@retvalNone
*/
voidSystemClock_Config(void)
{

RCC_OscInitTypeDefRCC_OscInitStruct;
RCC_ClkInitTypeDefRCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDefPeriphClkInit;

/**InitializestheCPU,AHBandAPBbussesclocks
*/
RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState=RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue=0;
RCC_OscInitStruct.MSIClockRange=RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLM=1;
RCC_OscInitStruct.PLL.PLLN=40;
RCC_OscInitStruct.PLL.PLLP=RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ=RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR=RCC_PLLR_DIV2;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct)!=HAL_OK)
{
_Error_Handler(__FILE__,__LINE__);
}

/**InitializestheCPU,AHBandAPBbussesclocks
*/
RCC_ClkInitStruct.ClockType=RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV1;

if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_4)!=HAL_OK)
{
_Error_Handler(__FILE__,__LINE__);
}

PeriphClkInit.PeriphClockSelection=RCC_PERIPHCLK_USART1;
PeriphClkInit.Usart1ClockSelection=RCC_USART1CLKSOURCE_PCLK2;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)!=HAL_OK)
{
_Error_Handler(__FILE__,__LINE__);
}

/**Configurethemaininternalregulatoroutputvoltage
*/
if(HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1)!=HAL_OK)
{
_Error_Handler(__FILE__,__LINE__);
}

/**ConfiguretheSystickinterrupttime
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

/**ConfiguretheSystick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/*SysTick_IRQninterruptconfiguration*/
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
}
pure_initcall(SystemClock_Config);

SysTick_Handler:

voidSysTick_Handler(void)
{
/*USERCODEBEGINSysTick_IRQn0*/

/*USERCODEENDSysTick_IRQn0*/
cola_timer_ticker();
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
/*USERCODEBEGINSysTick_IRQn1*/

/*USERCODEENDSysTick_IRQn1*/
}

編譯、下載、運(yùn)行:

d79175ca-1971-11ed-ba43-dac502259ad0.png

從運(yùn)行結(jié)果可以看到,task1的定時(shí)周期是task0的兩倍,符合預(yù)期。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17148

    瀏覽量

    351212
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    813

    瀏覽量

    119643
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68616

原文標(biāo)題:300多行代碼實(shí)現(xiàn)的一個(gè)多任務(wù)OS

文章出處:【微信號(hào):最后一個(gè)bug,微信公眾號(hào):最后一個(gè)bug】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    IOT OS比較,分析IOT OS的發(fā)展方向

    OS、AWorksOS、HybridOS等8個(gè)IOT OS的特點(diǎn)。智能物聯(lián)網(wǎng)(AIOT,AI+IOT)是人工智能與物聯(lián)網(wǎng)的協(xié)同應(yīng)用,據(jù)此分析IOT OS的發(fā)展方向。 關(guān)鍵字:物聯(lián)網(wǎng)操
    的頭像 發(fā)表于 08-16 17:12 ?4619次閱讀

    使用cola_os軟件定時(shí)器實(shí)現(xiàn)時(shí)間片輪詢(xún)框架

    如果使用RTOS顯得太浪費(fèi),這時(shí)候可以嘗試使用使用cola_os這類(lèi)基于軟件定時(shí)器實(shí)現(xiàn)的時(shí)間片輪詢(xún)框架。
    的頭像 發(fā)表于 09-22 09:03 ?1425次閱讀
    使用<b class='flag-5'>cola_os</b>軟件定時(shí)器實(shí)現(xiàn)時(shí)間片輪詢(xún)框架

    OS/400 PASE 入門(mén)

    iSeries 服務(wù)器時(shí),OS/400 PASE 提供很高的靈活性。當(dāng)然,OS/400 PASE 只是您可以選擇的多個(gè)選項(xiàng)之一。 API 分析 在確定應(yīng)用程序是否適合 OS/400
    發(fā)表于 11-13 21:47

    【干貨分享】μC/OS-II 軟件定時(shí)器的分析與測(cè)試

    個(gè)好的軟件定時(shí)器實(shí)現(xiàn)要求有較高的精度、較小的處理器開(kāi)銷(xiāo),且占用較少的存儲(chǔ)器資源。本文在對(duì) μC/OS-II 定時(shí)器算法分析的基礎(chǔ)上,對(duì)定時(shí)精度和處理器占用情況進(jìn)行了分析與測(cè)試,其結(jié)果在實(shí)時(shí)系統(tǒng)的設(shè)計(jì)與應(yīng)用中具有借鑒意義。
    發(fā)表于 02-21 11:58

    常用的嵌入式操作系統(tǒng)是什么?Linux OS/palm OS與Windows CE對(duì)比分析哪個(gè)好?

    嵌入式操作系統(tǒng)EOS具有什么特點(diǎn)常用的嵌入式操作系統(tǒng)是什么?Linux OS與Windows Ce對(duì)比分析哪個(gè)好palm OS與Windows CE對(duì)比分析哪個(gè)好
    發(fā)表于 04-27 07:06

    cola os程序框架介紹

    系列文章目錄嵌入式開(kāi)發(fā)|嵌入式軟件框架《一》常用的軟件框架介紹與選擇文章目錄系列文章目錄前言一、cola os程序框架1.cola_init2.cola_device3.cola_os task任務(wù)
    發(fā)表于 11-08 08:17

    嵌入式系統(tǒng)OS應(yīng)用層分析

    代碼結(jié)構(gòu),一般嵌入式系統(tǒng)都會(huì)有個(gè)OS。下面只分析應(yīng)用層:OS會(huì)給功能任務(wù)分配時(shí)間片,例如10ms、2ms、5ms,這個(gè)時(shí)間片對(duì)于stateflow的tick,也就是stateflow生成的函數(shù)
    發(fā)表于 12-17 06:35

    μC/OS-II的多任務(wù)系統(tǒng)實(shí)時(shí)性分析與優(yōu)先級(jí)分配

    μC/OS-II的多任務(wù)系統(tǒng)實(shí)時(shí)性分析與優(yōu)先級(jí)分配 從產(chǎn)品研發(fā)的角度,針對(duì)小資源系統(tǒng)中使用μC/OS-II的實(shí)時(shí)性和優(yōu)先級(jí)關(guān)系進(jìn)行了分析,提出了可刪除
    發(fā)表于 03-29 15:12 ?1003次閱讀
    μC/<b class='flag-5'>OS</b>-II的多任務(wù)系統(tǒng)實(shí)時(shí)性<b class='flag-5'>分析</b>與優(yōu)先級(jí)分配

    μC/OS-II實(shí)時(shí)性能測(cè)試與分析

    μC/OS-II實(shí)時(shí)性能測(cè)試與分析 任務(wù)切換時(shí)間和中斷響應(yīng)時(shí)間是嵌入式實(shí)時(shí)操作系統(tǒng)實(shí)時(shí)性能的重要指標(biāo)。本文對(duì)μC/OS-II的上述指標(biāo)進(jìn)行
    發(fā)表于 03-29 15:14 ?1536次閱讀
    μC/<b class='flag-5'>OS</b>-II實(shí)時(shí)性能測(cè)試與<b class='flag-5'>分析</b>

    μC/OS-II在EP7312上的移植

    μC/OS-II在EP7312上的移植首先介紹μC/OS-II操作系統(tǒng)的特點(diǎn),重點(diǎn)分析μC/OS-II在EP7312上的移植方法,介紹μC/OS
    發(fā)表于 06-16 11:24 ?1148次閱讀
    μC/<b class='flag-5'>OS</b>-II在EP7312上的移植

    UCOS-III OS_CPU_PendSVHandler源碼分析

    UCOS-III OS_CPU_PendSVHandler源碼分析
    發(fā)表于 08-28 10:48 ?13次下載

    嵌入式開(kāi)發(fā)|嵌入式軟件框架《二》前后臺(tái)任務(wù)框架-cola os系統(tǒng)

    系列文章目錄嵌入式開(kāi)發(fā)|嵌入式軟件框架《一》常用的軟件框架介紹與選擇文章目錄系列文章目錄前言一、cola os程序框架1.cola_init2.cola_device3.cola_os task任務(wù)
    發(fā)表于 11-03 13:51 ?18次下載
    嵌入式開(kāi)發(fā)|嵌入式軟件框架《二》前后臺(tái)任務(wù)框架-<b class='flag-5'>cola</b> <b class='flag-5'>os</b>系統(tǒng)

    COLA Architecture整潔面向?qū)ο蠓謱蛹軜?gòu)

    ./oschina_soft/COLA.zip
    發(fā)表于 06-14 09:41 ?0次下載
    <b class='flag-5'>COLA</b> Architecture整潔面向?qū)ο蠓謱蛹軜?gòu)

    慢下來(lái)&amp;快起來(lái),看Coca-Cola高效轉(zhuǎn)型路徑

    事半功倍 | 聚沙成塔, 打造 Coca-Cola 速度! 企業(yè)的數(shù)字化轉(zhuǎn)型并非“一蹴而就”,而是一個(gè)持續(xù)迭代的過(guò)程,從初期確認(rèn)需求、匯集資源到有效利用資源再到具體實(shí)踐,其中的每一個(gè)環(huán)節(jié)對(duì)于最終效果
    的頭像 發(fā)表于 01-06 06:50 ?463次閱讀

    什么是cola_os?

    cola_os是一個(gè)300多行代碼實(shí)現(xiàn)的多任務(wù)管理的OS,在很多MCU開(kāi)發(fā)中,功能很簡(jiǎn)單,實(shí)時(shí)性要求不強(qiáng),任務(wù)多了管理不當(dāng)又很亂。
    的頭像 發(fā)表于 02-09 17:00 ?1609次閱讀
    什么是<b class='flag-5'>cola_os</b>?