chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

【freeRTOS開(kāi)發(fā)筆記】xTaskCreate接口不返回

嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 2022-07-11 09:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 前言

最近博主在做一些適配freeRTOS的項(xiàng)目,簡(jiǎn)單來(lái)說(shuō)就是從別的RTOS平臺(tái)遷移到freeRTOS平臺(tái)。 由于之前的代碼都是可用的,憑經(jīng)驗(yàn)我們認(rèn)為只需要將OSAL的接口重新封裝一下,理論上上層的邏輯應(yīng)該問(wèn)題不大;但是我們沒(méi)想到的卻是在OSAL層適配的時(shí)候,遇到了一些之前沒(méi)有考慮到的問(wèn)題。

2 遇到的問(wèn)題

簡(jiǎn)單描述一下,我所遇到的問(wèn)題;這個(gè)問(wèn)題主要的體現(xiàn)就是在創(chuàng)建任務(wù)xTaskCreate的接口調(diào)用上,freeRTOS的接口原型為:

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName,     /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                            const configSTACK_DEPTH_TYPE usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;

我在一個(gè)任務(wù)里面調(diào)用該接口去創(chuàng)建一個(gè)新的任務(wù),然后我發(fā)現(xiàn)新建的任務(wù)跑起來(lái)了,但是我發(fā)起創(chuàng)建的任務(wù)卻不往下跑了。初步觀察,就是xTaskCreate接口沒(méi)有返回出來(lái)。

3 問(wèn)題分析

3.1 初略分析

考慮到我的操作場(chǎng)景是在從別的RTOS平臺(tái)遷移代碼到freeRTOS平臺(tái),所以第一感覺(jué)會(huì)是OSAL層封裝是不是有問(wèn)題? 于是把任務(wù)創(chuàng)建相關(guān)的OSAL接口重新捋了一遍,包括每個(gè)參數(shù)的傳參轉(zhuǎn)換是否正確,都做了一個(gè)遍,確認(rèn)封裝是沒(méi)有問(wèn)題的。 之前我們做代碼調(diào)試的時(shí)候,留了一手,就是在xTaskCreate內(nèi)部創(chuàng)建任務(wù)的時(shí)候,會(huì)把任務(wù)相關(guān)的一些信息打印出來(lái),以便觀察。

                    /* Allocate space for the TCB. */
                    pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */

                    if( pxNewTCB != NULL )
                    {
                        /* Store the stack location in the TCB. */
                        pxNewTCB->pxStack = pxStack;
                        kprintf("[THD]%s:[tcb]%x [stack]%x-%x:%d:%d\r\n", pcName, 
                        pxNewTCB, pxStack,
                        (size_t)pxStack + ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ), 
                        ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) )
                        , uxPriority);
                    }
                    else
                    {
                        /* The stack cannot be used as the TCB was not created.  Free
                         * it again. */
                        vPortFreeStack( pxStack );
                    }

所以這個(gè)調(diào)試信息,讓我發(fā)現(xiàn)了端倪,我在調(diào)用創(chuàng)建任務(wù)卡死不返回的地方,發(fā)現(xiàn)了如下log:

[THD]cli:[tcb]41a360 [stack]419758-41a358:3072:60

任務(wù)優(yōu)先級(jí)為60?好像freeRTOS不支持這么高數(shù)值的優(yōu)先級(jí)? 到這里,初步懷疑是任務(wù)優(yōu)先級(jí)數(shù)值的問(wèn)題導(dǎo)致的。

3.2 深究源碼

于是一步步去深究freerTOS的源碼,這就是開(kāi)源代碼的好處啊! 捋了一下代碼調(diào)用的關(guān)鍵路徑:

xTaskCreate ->
prvInitialiseNewTask ->
prvAddNewTaskToReadyList ->

其中在prvInitialiseNewTask中有以下代碼片段:

/* This is used as an array index so must ensure it's not too large. */
    configASSERT( uxPriority < configMAX_PRIORITIES );
    if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES )
    {
        uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U;
    }
    else
    {
        mtCOVERAGE_TEST_MARKER();
    }

    pxNewTCB->uxPriority = uxPriority;

這段代碼主要是對(duì)任務(wù)優(yōu)先級(jí)數(shù)值的檢查和處理,這里可以看到它會(huì)跟configMAX_PRIORITIES進(jìn)行比較,比如我的環(huán)境下,這個(gè)值是10,它是在freeRTOSConfig.h里面定義的。 從這段代碼可以知道,應(yīng)用層傳入的60優(yōu)先級(jí)實(shí)際被修改成9了;在freeRTOS里面,這是最高優(yōu)先級(jí)了。

/* Task */
#define configMAX_PRIORITIES                        ( 10 )

在freeRTOS里面,這個(gè)值可以定義大一些,但是需要多消耗一些RAM。

然后在prvAddNewTaskToReadyList中有以下代碼片段:

    if( xSchedulerRunning != pdFALSE )
    {
        /* If the created task is of a higher priority than the current task
         * then it should run now. */
        if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority )
        {
            taskYIELD_IF_USING_PREEMPTION();
        }
        else
        {
            mtCOVERAGE_TEST_MARKER();
        }
    }
    else
    {
        mtCOVERAGE_TEST_MARKER();
    }

這里尤其注意第2個(gè)if語(yǔ)句,如果創(chuàng)建的新任務(wù)優(yōu)先級(jí)更高,那么就立即執(zhí)行它:

#define portYIELD()                    __asm ( "SWI 0" )

#ifndef portYIELD_WITHIN_API
    #define portYIELD_WITHIN_API    portYIELD
#endif

#if ( configUSE_PREEMPTION == 0 )

/* If the cooperative scheduler is being used then a yield should not be
 * performed just because a higher priority task has been woken. */
    #define taskYIELD_IF_USING_PREEMPTION()
#else
    #define taskYIELD_IF_USING_PREEMPTION()    portYIELD_WITHIN_API()
#endif

在我的平臺(tái),直接就跑到SWI0了,及產(chǎn)生一個(gè)軟中斷,隨后就立即發(fā)生任務(wù)調(diào)度了。 那么這個(gè)時(shí)候,這個(gè)低優(yōu)先級(jí)的任務(wù)(調(diào)用了xTaskCreate的任務(wù))感覺(jué)就沒(méi)法往下執(zhí)行了,因?yàn)閘og都不打了!

3.3 代碼驗(yàn)證

其實(shí)通過(guò)debug信息,我只需要在xTaskCreate的入口和出口加上調(diào)試信息就可以知道到底退沒(méi)退出,但是我無(wú)法驗(yàn)證是否真的是:高優(yōu)先級(jí)的任務(wù)創(chuàng)建低優(yōu)先級(jí)的任務(wù)可以退出,而低優(yōu)先級(jí)的任務(wù)創(chuàng)建高優(yōu)先級(jí)的任務(wù)無(wú)法退出。 于是我寫了以下代碼做個(gè)簡(jiǎn)單驗(yàn)證:

#include "task.h"

TaskHandle_t calling_task;
TaskHandle_t lower_task;
TaskHandle_t higher_task;

void create_lower_task(void *data)
{
    TaskStatus_t TaskStatus;

    vTaskGetInfo( lower_task,
                   &TaskStatus,
                   0,
                   eInvalid);
    while(1) {
        task_debug("%s:%d >>> prio: %d\r\n", __func__, __LINE__, TaskStatus.uxCurrentPriority);
        vTaskDelay(1000);
    }
}

void create_higher_task(void *data)
{
    TaskStatus_t TaskStatus;

    vTaskGetInfo( higher_task,
                   &TaskStatus,
                   0,
                   eInvalid);

    while(1) {
        task_debug("%s:%d >>> prio: %d\r\n", __func__, __LINE__, TaskStatus.uxCurrentPriority);
        vTaskDelay(1000);
    }
}

void create_calling_task(void *data)
{
    int ret;
    int lower_prio = 3;
    int higher_prio = 60; //final set to prio 9
    TaskStatus_t TaskStatus;

    (void)higher_prio;

    vTaskGetInfo( lower_task,
                   &TaskStatus,
                   0,
                   eInvalid);

    task_debug("%s:%d >>> prio: %d\r\n", __func__, __LINE__, TaskStatus.uxCurrentPriority);
    ret = xTaskCreate(create_lower_task, "test-2", 256, NULL, lower_prio, 
        (TaskHandle_t * const )&lower_task);
    if (ret != pdPASS) {
        task_debug("Error: Failed to create test task: %d\r\n", ret);
    }
    task_debug("%s:%d >>>\r\n", __func__, __LINE__);
#if 1
    task_debug("%s:%d >>>\r\n", __func__, __LINE__);
    ret = xTaskCreate(create_higher_task, "test-3", 256, NULL, higher_prio, 
        (TaskHandle_t * const )&higher_task);
    if (ret != pdPASS) {
        task_debug("Error: Failed to create test task: %d\r\n", ret);
    }
    task_debug("%s:%d >>>\r\n", __func__, __LINE__);
#endif

    while(1) {
        task_debug("%s:%d >>> prio: %d\r\n", __func__, __LINE__, TaskStatus.uxCurrentPriority);
        vTaskDelay(1000);
    }
}

void freertos_task_priority_test(void)
{
    int ret;
    int cur_prio = 4;

    {
        TaskStatus_t TaskStatus;

        vTaskGetInfo( xTaskGetHandle( "extended_app" ),
                   &TaskStatus,
                   0,
                   eInvalid);
        task_debug("%s:%d >>> prio: %d\r\n", __func__, __LINE__, TaskStatus.uxCurrentPriority);
    }

    task_debug("%s:%d >>>\r\n", __func__, __LINE__);
    ret = xTaskCreate(create_calling_task, "test-1", 256, NULL, cur_prio, 
        (TaskHandle_t * const )&calling_task);
    if (ret != pdPASS) {
        cli_printf("Error: Failed to create test task: %d\r\n", ret);
    }
    task_debug("%s:%d >>>\r\n", __func__, __LINE__);
}

#endif

結(jié)果代碼一跑,卻超出了我之前的預(yù)想:

freertos_task_priority_test:793 >>> prio: 4
freertos_task_priority_test:796 >>>
[THD]test-1:[tcb]419b68 [stack]419760-419b60:1024:4
freercreate_calling_task:758tos_task_priority_test: >>> prio: 4
[THD]test802 >>>
[THD]cli:[tcb]-2:[tcb]41a1e8 [stack]4419bd8 [stack]41a258-4119de0-41a1e0:1024:3
creae58:3072:60
ate_calling_task:764 >>>
create_calling_task:766 >>>
[THD]test-3:[tcb]419c48 [stack]41ae60-41b260:1024:60
create_higher_task:739 >>> prio: 9
create_calling_task:772 >>>
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3

create_higher_task:739 >>> prio: 9
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3
create_higher_task:739 >>> prio: 9
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3
create_higher_task:739 >>> prio: 9
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3
create_higher_task:739 >>> prio: 9
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3
create_higher_task:739 >>> prio: 9
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3
create_higher_task:739 >>> prio: 9
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3
create_higher_task:739 >>> prio: 9
create_calling_task:776 >>> prio: 4
create_lower_task:724 >>> prio: 3

簡(jiǎn)單來(lái)說(shuō),就是xTaskCreate壓根就沒(méi)有卡住?。?一個(gè)任務(wù)優(yōu)先級(jí)為4的任務(wù),分別創(chuàng)建任務(wù)優(yōu)先級(jí)為3和9的任務(wù),都跑的好好的,并沒(méi)有發(fā)現(xiàn)xTaskCreate不返回的問(wèn)題! 難道是我哪里想錯(cuò)了?

3.4 進(jìn)一步分析

通過(guò)上面的簡(jiǎn)單代碼已經(jīng)驗(yàn)證了,我之前的猜想是不對(duì)的,但是我的確看到了在我的應(yīng)用代碼里面出現(xiàn)了xTaskCreate卡死不返回的情況,還需要再細(xì)細(xì)分析下我新創(chuàng)建的這個(gè)任務(wù),多半是問(wèn)題出在它身上,因?yàn)槲移帘瘟藙?chuàng)建它,問(wèn)題就沒(méi)有復(fù)現(xiàn)了。 為了說(shuō)明問(wèn)題,我把這個(gè)任務(wù)的執(zhí)行代碼簡(jiǎn)略了下:

void task_main(void *data)
{
    int32_t ret;

    char *msg = NULL;

    while (!task_cancel_check()) {
        if (task_get_input(g_cli->inbuf, &g_cli->bp) != 0) {
            /* do something */
        }
    }

    task_exit();
}

看到這偽代碼,也許你發(fā)現(xiàn)了點(diǎn)問(wèn)題,這個(gè)while里面看樣子都是查詢下的代碼,并且沒(méi)有延時(shí)處理,如果這個(gè)任務(wù)的優(yōu)先級(jí)是最高的,那么它將一直占用CPU,別的任務(wù)壓根無(wú)法被調(diào)度到。 回想我的代碼場(chǎng)景,傳入了一個(gè)優(yōu)先級(jí)60,被減小到configMAX_PRIORITIES-1,即優(yōu)先級(jí)為9;這個(gè)在freeRTOS里面可是最高優(yōu)先級(jí)的任務(wù)了,所以才出現(xiàn)了xTaskCreate無(wú)法退出返回;因?yàn)檫@個(gè)時(shí)候除這個(gè)最高優(yōu)先級(jí)的任務(wù)在跑外,其他任務(wù)都可能跑不起來(lái)了。

3.5 如何優(yōu)化

明白了出現(xiàn)問(wèn)題的原因,修改一來(lái)就很簡(jiǎn)單了,這里提供兩個(gè)思路:

1) 把這個(gè)taskmain修改成一個(gè)合適的優(yōu)先級(jí),像這個(gè)不緊急的任務(wù),建議設(shè)置成次優(yōu)先級(jí)即可,即優(yōu)先級(jí)數(shù)值為1; 2)在taskmain的while循環(huán)里面,加上適當(dāng)?shù)膁elay,比如vTaskDelay(1),讓其在合適的時(shí)間讓出CPU。

理論上,以上兩種方案都可以解決問(wèn)題,但是肯定強(qiáng)烈推薦方式1,因?yàn)樗攀墙鉀Q根源的思路。

4 經(jīng)驗(yàn)總結(jié)

  • freeRTOS的優(yōu)先級(jí)定義與別人不一樣,不要混淆!
  • 在freeRTOS里面創(chuàng)建任務(wù),注意考量下優(yōu)先級(jí)的問(wèn)題,不能隨意定義優(yōu)先級(jí)!
  • 高優(yōu)先級(jí)的任務(wù)里面創(chuàng)建低優(yōu)先級(jí)的任務(wù)是可以的;但是反過(guò)來(lái),低優(yōu)先級(jí)任務(wù)里面創(chuàng)建高優(yōu)先級(jí)任務(wù),也是可以的!
  • 編寫任務(wù)的執(zhí)行函數(shù),注意不要讓它死跑,如果沒(méi)有調(diào)用阻塞式的可以引起系統(tǒng)掛起的接口,適當(dāng)使用vTaskDelay接口讓任務(wù)讓出CPU。

5 更多分享

歡迎關(guān)注我的github倉(cāng)庫(kù)01workstation,日常分享一些開(kāi)發(fā)筆記和項(xiàng)目實(shí)戰(zhàn),歡迎指正問(wèn)題。

同時(shí)也非常歡迎關(guān)注我的CSDN主頁(yè)和專欄:

【CSDN主頁(yè):架構(gòu)師李肯】

RT-Thread主頁(yè):架構(gòu)師李肯】

【C/C++語(yǔ)言編程專欄】

【GCC專欄】

【信息安全專欄】

【RT-Thread開(kāi)發(fā)筆記】

【freeRTOS開(kāi)發(fā)筆記】

有問(wèn)題的話,可以跟我討論,知無(wú)不答,謝謝大家。

審核編輯:湯梓紅

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

    關(guān)注

    33

    文章

    9269

    瀏覽量

    155452
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    856

    瀏覽量

    122202
  • FreeRTOS
    +關(guān)注

    關(guān)注

    14

    文章

    496

    瀏覽量

    65739
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    freeRTOS開(kāi)發(fā)筆記】關(guān)注創(chuàng)建任務(wù)時(shí)傳入優(yōu)先級(jí)數(shù)值問(wèn)題

    freeRTOS開(kāi)發(fā)筆記】關(guān)注創(chuàng)建任務(wù)時(shí)傳入的優(yōu)先級(jí)數(shù)值問(wèn)題
    的頭像 發(fā)表于 07-11 09:13 ?3296次閱讀
    【<b class='flag-5'>freeRTOS</b><b class='flag-5'>開(kāi)發(fā)筆記</b>】關(guān)注創(chuàng)建任務(wù)時(shí)傳入優(yōu)先級(jí)數(shù)值問(wèn)題

    freeRTOS開(kāi)發(fā)筆記】記一次坑爹的freeTOS升級(jí)

    freeRTOS開(kāi)發(fā)筆記】記一次坑爹的freeTOS-v9.0.0升級(jí)到freeRTOS-v10.4.4
    的頭像 發(fā)表于 07-11 09:15 ?5633次閱讀
    【<b class='flag-5'>freeRTOS</b><b class='flag-5'>開(kāi)發(fā)筆記</b>】記一次坑爹的freeTOS升級(jí)

    安卓開(kāi)發(fā)筆記

    安卓開(kāi)發(fā)筆記(中文)
    發(fā)表于 04-26 10:57

    基于STM32的USB程序開(kāi)發(fā)筆記 匯總

    忙了一下午終于有時(shí)間整理了,基于STM32的USB程序開(kāi)發(fā)筆記匯總,需要的親們點(diǎn)擊鏈接閱讀哈!{:4_95:}基于STM32的USB程序開(kāi)發(fā)筆記(一)https://bbs.elecfans.com
    發(fā)表于 03-20 16:08

    Modbus庫(kù)開(kāi)發(fā)筆記之十一:關(guān)于Modbus協(xié)議棧開(kāi)發(fā)的說(shuō)明

    們不就使用的最終結(jié)果負(fù)責(zé)。當(dāng)然如果發(fā)現(xiàn)任何的不足,我們非常并歡迎大家將發(fā)現(xiàn)的問(wèn)題告知我們,以便我們持續(xù)的改進(jìn)之。本系列的全部分裝如下:Modbus庫(kù)開(kāi)發(fā)筆記之一:實(shí)現(xiàn)功能的基本設(shè)計(jì)https
    發(fā)表于 08-27 20:32

    壇友經(jīng)驗(yàn)分享之STM32的USB程序開(kāi)發(fā)筆記

    基于STM32的USB程序開(kāi)發(fā)筆記(一)基于STM32的USB程序開(kāi)發(fā)筆記(二)基于STM32的USB程序開(kāi)發(fā)筆記(三)基于STM32的USB程序開(kāi)發(fā)筆記(四)基于STM32的USB程
    發(fā)表于 09-04 17:42

    基于STM32的USB程序開(kāi)發(fā)筆記

    基于STM32的USB程序開(kāi)發(fā)筆記
    發(fā)表于 04-24 09:23

    Odrive開(kāi)發(fā)筆記 精選資料推薦

    Odrive開(kāi)發(fā)筆記文章目錄Odrive開(kāi)發(fā)筆記接線配置進(jìn)入校準(zhǔn)測(cè)試用python來(lái)控制odrive電機(jī)控制介紹位置環(huán)速度環(huán)把從一開(kāi)始做odrive驅(qū)動(dòng)無(wú)刷電機(jī)的所有過(guò)程都記錄下來(lái)接線1. 首先
    發(fā)表于 09-02 07:33

    求大佬分享STM32CubeMX-HAL庫(kù)開(kāi)發(fā)筆記

    求大佬分享STM32CubeMX-HAL庫(kù)開(kāi)發(fā)筆記
    發(fā)表于 12-02 07:26

    求大佬分享CAN開(kāi)發(fā)筆記

    求大佬分享CAN開(kāi)發(fā)筆記
    發(fā)表于 02-07 06:16

    基于STM32的USB程序開(kāi)發(fā)筆記

    基于STM32的USB程序開(kāi)發(fā)筆記STM32 USB 源代碼及筆記下載.rar
    發(fā)表于 10-09 06:05

    STM32的USB程序開(kāi)發(fā)筆記

    STM32的USB程序開(kāi)發(fā)筆記
    發(fā)表于 09-29 14:55 ?27次下載
    STM32的USB程序<b class='flag-5'>開(kāi)發(fā)筆記</b>

    基于LM3S網(wǎng)絡(luò)開(kāi)發(fā)筆記3_多網(wǎng)頁(yè)開(kāi)發(fā)

    基于LM3S網(wǎng)絡(luò)開(kāi)發(fā)筆記3_多網(wǎng)頁(yè)開(kāi)發(fā)
    發(fā)表于 10-11 08:52 ?4次下載
    基于LM3S網(wǎng)絡(luò)<b class='flag-5'>開(kāi)發(fā)筆記</b>3_多網(wǎng)頁(yè)<b class='flag-5'>開(kāi)發(fā)</b>

    基于LM3S網(wǎng)絡(luò)開(kāi)發(fā)筆記1_開(kāi)發(fā)平臺(tái)

    基于LM3S網(wǎng)絡(luò)開(kāi)發(fā)筆記1_開(kāi)發(fā)平臺(tái)
    發(fā)表于 10-11 08:57 ?4次下載
    基于LM3S網(wǎng)絡(luò)<b class='flag-5'>開(kāi)發(fā)筆記</b>1_<b class='flag-5'>開(kāi)發(fā)</b>平臺(tái)

    Qt嵌入式開(kāi)發(fā)筆記

    Qt嵌入式開(kāi)發(fā)筆記,未完整qmake,qt元對(duì)象系統(tǒng),內(nèi)存管理,信號(hào)與槽,事件處理,多線程開(kāi)發(fā)
    發(fā)表于 11-03 10:21 ?38次下載
    Qt嵌入式<b class='flag-5'>開(kāi)發(fā)筆記</b>