一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

i.MX RT1170:VGLite移植RT-Thread Nano過(guò)程講解(下)

恩智浦MCU加油站 ? 來(lái)源:恩智浦MCU加油站 ? 2023-11-09 11:22 ? 次閱讀

上篇介紹了如何移植 RT-Thread Nano 內(nèi)核與 Finsh 控制臺(tái)到 RT1170。本篇繼續(xù)介紹如何將 NXP 官方的 VGLite API 移植到 RT-Thread Nano 上。

RT-Thread配置

rtconfig.h 可對(duì) RT-Thread 配置,因 VGLite 會(huì)使用互斥量、消息隊(duì)列等,故取消以下注釋:

#define RT_USING_MUTEX
#define RT_USING_MESSAGEQUEUE
#define RT_USING_HEAP

郵箱機(jī)制在本工程并不使用,可以注釋掉:

// #define RT_USING_MAILBOX
默認(rèn)最大名稱長(zhǎng)度為 8,可以更改為 16 以容納更長(zhǎng)名稱:
#define RT_NAME_MAX    16
FreeRTOS 工程 tick 頻率為 200,RT-Thread Nano 默認(rèn) tick 頻率為 1000,可與原工程保持一致:
#define RT_TICK_PER_SECOND  200

FreeRTOS與RT-Thread對(duì)比

首先分析 FreeRTOS 與 RT-Thread 的一些區(qū)別,以加深讀者理解,幫助后續(xù)用 RT-Thread API 改寫(xiě) FreeRTOS API 。 1. 任務(wù)與線程

FreeRTOS 稱線程為 “任務(wù)”(task), 而 RT-Thread 直接稱為 “線程”(Thread),這一術(shù)語(yǔ)尚未達(dá)成共識(shí),兩者只是同一事物的不同表述。

2. 任務(wù)(線程)優(yōu)先級(jí)

FreeRTOS 中,優(yōu)先級(jí)范圍為 0 到 configMAX_PRIORITIES - 1,該宏在 FreeRTOSConfig.h 中定義,數(shù)字越低則該任務(wù)優(yōu)先級(jí)越低。

RT-Thread 中,優(yōu)先級(jí)范圍為 0 到 RT_THREAD_PRIORITY_MAX - 1,該宏在 rtconfig.h 中定義,數(shù)字越低線程優(yōu)先級(jí)卻越高,這點(diǎn)與 FreeRTOS 相反。

3. 任務(wù)(線程)調(diào)度 FreeRTOS 中,需手動(dòng)調(diào)用 vTaskStartScheduler()開(kāi)啟任務(wù)調(diào)度器。任務(wù)一旦創(chuàng)建便直接參與調(diào)度運(yùn)行。時(shí)間片輪轉(zhuǎn)調(diào)度時(shí),各相同優(yōu)先級(jí)線程的單次運(yùn)行時(shí)間片統(tǒng)一為 1,即 1 個(gè) tick 便調(diào)度一次。

RT-Thread 中,系統(tǒng)初始化時(shí)就已調(diào)用了 rt_system_scheduler_start(),無(wú)需再手動(dòng)開(kāi)啟。但創(chuàng)建后的線程尚位于初始狀態(tài),初始狀態(tài)的線程均需調(diào)用 rt_thread_startup()才會(huì)參與調(diào)度運(yùn)行。各線程的單次運(yùn)行時(shí)間片在創(chuàng)建時(shí)可指定為不同 tick。

4. 中斷適用函數(shù)

FreeRTOS 中,涉及上下文切換的函數(shù)存在兩個(gè)版本:一種是在任務(wù)中的常規(guī)版本;另一種則用于中斷內(nèi)調(diào)用,通常以 FromISR()結(jié)尾。若中斷調(diào)用的 API 喚醒了更高優(yōu)先級(jí)的線程,需手動(dòng)調(diào)用 portYIELD_FROM_ISR(xHigherPriorityTaskWoken)以在中斷退出時(shí)喚醒高優(yōu)先級(jí)線程。

RT-Thread 中,線程與中斷可使用同一 API。但中斷內(nèi)不能使用掛起當(dāng)前線程的操作,若使用則會(huì)打印 "Function[xxx_func] shall not used in ISR" 的提示信息。若中斷內(nèi)的函數(shù)喚醒了更高優(yōu)先級(jí)的線程,則中斷退出時(shí)會(huì)自動(dòng)切換到高優(yōu)先級(jí)線程,無(wú)需手動(dòng)切換。

5. 線程本地?cái)?shù)據(jù)

FreeRTOS 中,線程的本地?cái)?shù)據(jù)為一個(gè)數(shù)組,長(zhǎng)度由 FreeRTOSConfig.h 中的 configNUM_THREAD_LOCAL_STORAGE_POINTERS 宏設(shè)置。

RT-Thread 中,線程的本地?cái)?shù)據(jù)為一個(gè) uint32 格式的 user_data 變量,而非數(shù)組。若要在線程本地存儲(chǔ)數(shù)組、結(jié)構(gòu)體等數(shù)據(jù),可手動(dòng)創(chuàng)建后將地址存入該變量。

6. 信號(hào)

FreeRTOS 中,分為二值信號(hào)量與計(jì)數(shù)信號(hào)量。二值信號(hào)量最大值為 1 ,初值為 0 。計(jì)數(shù)信號(hào)量的最大值和初值均可在創(chuàng)建時(shí)分別指定。

RT-Thread 中,未區(qū)分二值或計(jì)數(shù)信號(hào)量,且僅能指定信號(hào)量初值,最大值無(wú)法指定,統(tǒng)一為 65535 。此外,信號(hào)量在創(chuàng)建時(shí)可選先入先出模式(RT_IPC_FLAG_FIFO)或優(yōu)先級(jí)模式(RT_IPC_FLAG_PRIO),通常選用優(yōu)先級(jí)模式以保證線程實(shí)時(shí)性。

7. 互斥量

FreeRTOS 中,除創(chuàng)建的 API 以外,互斥量的結(jié)構(gòu)體與持有、釋放與刪除所使用的 API ,與信號(hào)量的相同。

RT-Thread 中,互斥量擁有一套獨(dú)立的 API ,而非與信號(hào)量共用 API 。

8. 頭文件

FreeRTOS 中,當(dāng)使用信號(hào)量、互斥量、隊(duì)列等,除 FreeRTOS.h 外,需額外包含其他對(duì)應(yīng)的頭文件。

RT-Thread 中,通常僅需包含 rtthread.h 即可使用信號(hào)量、互斥量、隊(duì)列等。

VGLite 代碼改寫(xiě)

首先,可將上篇工程中排除編譯的組與文件恢復(fù)回去,并恢復(fù)之前備份的 /source/clock_rtthread.c 代碼。

1. 頭文件更改

工程在以下文件中會(huì)使用到 RT-Thread ,需包含頭文件:#include "rtthread.h":

/source/clock_rtthread.c

/vglite/VGLite/rtos/vg_lite_os.c(較多改動(dòng))

/vglite/VGLiteKernel/rtos/vg_lite_hal.c

/vglite/font/vft_draw.c

/elementary/src/elm_os.c

/elementary/src/velm.h

/video/fsl_fbdev.h

/video/fsl_dc_fb_lcdifv2.c

/video/fsl_video_common.c

/utilities/fsl_debug_console.c

2. 線程 API 改寫(xiě)

FreeRTOS 中的 xTaskCreate()可由 RT-Thread 中的 rt_thread_create()替換。注意兩者優(yōu)先級(jí)數(shù)字代表的高低相反,需轉(zhuǎn)換。rt_thread_create()中可指定線程單次運(yùn)行的時(shí)間片,若 RT-Thread 已設(shè)置 tick 頻率與原 FreeRTOS 相等,則時(shí)間片可全部設(shè)置為1。vTaskDelete(NULL)為刪除當(dāng)前線程,RT-Thread 可用 rt_thread_delete(rt_thread_self())代替。TaskHandle_t 結(jié)構(gòu)體由 rt_thread_t 代替。

而原有的 vTaskStartScheduler()應(yīng)刪除,改用 rt_thread_startup()啟動(dòng)指定線程。此外,命名中的 "task" 可替換為"thread" 以符合 RT-Thread 規(guī)范。

/source/clock_rtthread.c的線程相關(guān)代碼對(duì)比主要如下:(篇幅所限,僅以有代表性的文件與函數(shù)為例,其他未列出的文件和函數(shù)可根據(jù)例子參考,對(duì)編譯錯(cuò)誤信息位置改寫(xiě),下同)

xTaskCreate(vglite_task, "vglite_task", configMINIMAL_STACK_SIZE + 200, NULL, configMAX_PRIORITIES - 1, NULL)
^^^^^^
rt_thread_t vglite_thread_handle = rt_thread_create("vglite_thread", vglite_thread, RT_NULL, 1024, 0, 1);


vTaskStartScheduler();
^^^^^^
if (vglite_thread_handle != RT_NULL)
  rt_thread_startup(vglite_thread_handle);

/vglite/VGLite/rtos/vg_lite_os.c 更改的線程相關(guān)代碼主要如下:

#define QUEUE_TASK_PRIO  (configMAX_PRIORITIES - 1)
^^^^^^^
#define QUEUE_THREAD_PRIO  0


vTaskDelete(NULL);
^^^^^^^
rt_thread_delete(rt_thread_self());


ret = xTaskCreate(command_queue, QUEUE_TASK_NAME, QUEUE_TASK_SIZE, NULL, QUEUE_TASK_PRIO, &os_obj.task_hanlde);
^^^^^^^
os_obj.task_hanlde = rt_thread_create(QUEUE_THREAD_NAME, command_queue, NULL, QUEUE_THREAD_SIZE, QUEUE_THREAD_PRIO, 1);
if (os_obj.task_hanlde != RT_NULL)
    rt_thread_startup(os_obj.task_hanlde);

3. 信號(hào)量 API 改寫(xiě)

原xSemaphoreCreateCounting()與 xSemaphoreCreateBinary()均可使用 rt_sem_create()代替,rt_sem_create()需設(shè)置名稱,無(wú)需設(shè)置最大值,初值通常為 0,排隊(duì)方式一般采用 RT_IPC_FLAG_PRIO ,下同。SemaphoreHandle_t 結(jié)構(gòu)體換為 rt_sem_t 。

xSemaphoreTake()可替換為 rt_sem_take(),F(xiàn)reeRTOS 中 portMAX_DELAY 代表無(wú)限等待,可換為 RT-Thread 的 RT_WAITING_FOREVER 。若原 FreeRTOS 中指定過(guò)期 tick 形如 timeout / portTICK_PERIOD_MS,應(yīng)使用(rt_int32)((rt_int64)timeout * RT_TICK_PER_SECOND / 1000)替換。

判斷返回值由 pdTRUE 替換為 RT_EOK 。xSemaphoreGive()換為 rt_sem_release()。vSemaphoreDelete()使用 rt_sem_delete()替換。有關(guān)信號(hào)量的中斷內(nèi)函數(shù) xSemaphoreGiveFromISR()在下文再詳細(xì)講解。

以 /vglite/VGLite/rtos/vg_lite_os.c 為例,信號(hào)量代碼對(duì)比主要如下:

command_semaphore = xSemaphoreCreateCounting(30,0);
^^^^^^^
command_semaphore = rt_sem_create("cs", 0, RT_IPC_FLAG_PRIO);


int_queue = xSemaphoreCreateBinary();
^^^^^^^
int_queue = rt_sem_create("iq", 0, RT_IPC_FLAG_PRIO);


if (xSemaphoreTake(int_queue, timeout / portTICK_PERIOD_MS) == pdTRUE)
^^^^^^^
if (rt_sem_take(int_queue, (rt_int32_t) ((rt_int64_t)timeout * RT_TICK_PER_SECOND / 1000)) == RT_EOK)

4. 互斥量 API 改寫(xiě)

xSemaphoreCreateMutex()替換為 rt_mutex_create(),需指定名稱與排隊(duì)方式。SemaphoreHandle_t 結(jié)構(gòu)體替換為 rt_mutex_t 。

其他互斥量 API 的改寫(xiě)與信號(hào)量基本一致。xSemaphoreTake()、xSemaphoreGive()、vSemaphoreDelete()替換為 rt_mutex_take()、rt_mutex_release()、rt_mutex_delete()。

/vglite/VGLite/rtos/vg_lite_os.c中,互斥量代碼對(duì)比主要如下:

mutex = xSemaphoreCreateMutex();
^^^^^^^
mutex = rt_mutex_create("mut", RT_IPC_FLAG_PRIO);


if(xSemaphoreTake(mutex, TASK_WAIT_TIME/portTICK_PERIOD_MS) == pdTRUE)
^^^^^^^
if(rt_mutex_take(mutex, (rt_int32_t) ((rt_int64_t)MAX_MUTEX_TIME * RT_TICK_PER_SECOND / 1000)) != RT_EOK)

5. 消息隊(duì)列 API 改寫(xiě)

xQueueCreate()替換為 rt_mq_create(),需指定名稱與排隊(duì)方式。QueueHandle_t 結(jié)構(gòu)體替換為 rt_mq_t 。

RT-Thread 無(wú)類似 uxQueueMessagesWaiting()的函數(shù)用于確認(rèn)隊(duì)列是否不為空,但 rt_mq_t 結(jié)構(gòu)體中的 entry 變量表示隊(duì)列的消息數(shù),故可用 if (xxx->entry) 代替。

xQueueReceive(), xQueueSend()更換為 rt_mq_recv() ,rt_mq_send_wait(),需額外指定發(fā)送與接收消息的大小,同時(shí)也需注意過(guò)期 tick 的轉(zhuǎn)換。

/vglite/VGLite/rtos/vg_lite_os.c中,消息隊(duì)列代碼對(duì)比主要如下:

os_obj.queue_handle = xQueueCreate(QUEUE_LENGTH, sizeof(vg_lite_queue_t * ));
^^^^^^^
os_obj.queue_handle = rt_mq_create("queue_vglite", sizeof(vg_lite_queue_t * ), QUEUE_LENGTH, RT_IPC_FLAG_PRIO);


if(uxQueueMessagesWaiting(os_obj.queue_handle))
^^^^^^^
if(os_obj.queue_handle->entry)


ret = xQueueReceive(os_obj.queue_handle, (void*) &peek_queue, TASK_WAIT_TIME/portTICK_PERIOD_MS);
^^^^^^^
ret = rt_mq_recv(os_obj.queue_handle, (void*) &peek_queue, os_obj.queue_handle->msg_size, (rt_int32_t) ((rt_int64_t)TASK_WAIT_TIME * RT_TICK_PER_SECOND / 1000));


if(xQueueSend(os_obj.queue_handle, (void *) &queue_node, ISR_WAIT_TIME/portTICK_PERIOD_MS) != pdTRUE)
^^^^^^^
if(rt_mq_send_wait(os_obj.queue_handle, (void *) &queue_node, os_obj.queue_handle->msg_size, (rt_int32_t) ((rt_int64_t)ISR_WAIT_TIME * RT_TICK_PER_SECOND / 1000)) != RT_EOK)

6. 中斷內(nèi) API 改寫(xiě)

FreeRTOS 中斷內(nèi)采用 xSemaphoreGiveFromISR()信號(hào)量釋放函數(shù)保證以中斷安全,且根據(jù) xHigherPriorityTaskWoken 變量,需使用 portYIELD_FROM_ISR()手動(dòng)切換上下文;而 RT-Thread 仍使用通用的 rt_sem_release(),且可自動(dòng)切換上下文。

/vglite/VGLite/rtos/vg_lite_os.c中,中斷內(nèi)代碼對(duì)比主要如下:

portBASE_TYPExHigherPriorityTaskWoken=pdFALSE;
xSemaphoreGiveFromISR(int_queue,&xHigherPriorityTaskWoken);
if(xHigherPriorityTaskWoken!=pdFALSE)
    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
^^^^^^^
rt_sem_release(int_queue);
7. 內(nèi)存管理 API 改寫(xiě)

pvPortMalloc()代替為 rt_malloc(),vPortFree()代替為 rt_free()即可。

8. 臨界區(qū)資源 API 改寫(xiě)

portENTER_CRITICAL()與 portEXIT_CRITICAL()需替換為 rt_enter_critical()與 rt_exit_critical()。

9. 時(shí)間相關(guān) API 改寫(xiě)

vTaskDelay()可替換為 rt_thread_delay()。若用于延時(shí)指定毫秒,也可直接使用 rt_thread_mdelay()代替,無(wú)需再計(jì)算毫秒對(duì)應(yīng)的 tick。xTaskGetTickCount()用于得到 tick 的計(jì)數(shù)值,可用 rt_tick_get()代替。

/source/clock_rtthread.c的時(shí)間相關(guān)代碼對(duì)比如下:

return(uint32_t)(xTaskGetTickCount()*portTICK_PERIOD_MS);
^^^^^^^
return(rt_tick_t)((rt_uint64_t)rt_tick_get()*1000/RT_TICK_PER_SECOND);
/vglite/VGLite/rtos/vg_lite_os.c中,延時(shí)代碼對(duì)比如下,無(wú)需再計(jì)算毫秒對(duì)應(yīng)的 tick
vTaskDelay((configTICK_RATE_HZ*msec+999)/1000);
^^^^^^^
rt_thread_mdelay(msec);
10. 線程本地?cái)?shù)據(jù) API 改寫(xiě)

FreeRTOS 中各線程的本地?cái)?shù)據(jù)為一個(gè)數(shù)組,而 RT-Thread 中線程本地?cái)?shù)據(jù)僅有一個(gè)名為 user_data 的變量。

原 VGLite 僅使用了 FreeRTOS 本地?cái)?shù)組中第一個(gè)元素,若用 RT-Thread 僅改用 VGLite API,則可直接用 user_data 變量保存原數(shù)組中第一個(gè)元素。但若也使用了 Elementary (即本工程),Elementary 也需要存放一個(gè)線程本地變量,此時(shí)本地?cái)?shù)據(jù)便需要存放兩個(gè)變量。這是使用 RT-Thread Nano 需要先開(kāi)辟一個(gè)數(shù)組空間以存放兩個(gè)變量,再將數(shù)組地址存放于本地的 user_data 變量中。

在工程 /vglite/VGLite/rtos/vg_lite_os.c 中新建數(shù)組 tls_array 并添加 vg_lite_os_init_tls_array()、 vg_lite_os_deinit_tls_array()函數(shù),再在對(duì)應(yīng)的 .h 文件中聲明。vg_lite_os_init_tls_array()將數(shù)組地址存入當(dāng)前線程的 user_data 變量;vg_lite_os_deinit_tls_array()則用于刪除當(dāng)前線程 user_data 中的數(shù)組地址。

#define TLS_ARRAY_LENGTH    2
rt_uint32_t tls_array[TLS_ARRAY_LENGTH] = {NULL};


int32_t vg_lite_os_init_tls_array(void) {
    rt_thread_t rt_TCB = rt_thread_self();
    RT_ASSERT( rt_TCB != NULL );
rt_TCB->user_data=(rt_uint32_t)tls_array;
    return VG_LITE_SUCCESS;
}
void vg_lite_os_deinit_tls_array(void) {
    rt_thread_t rt_TCB = rt_thread_self();
    RT_ASSERT( rt_TCB != NULL );
    rt_TCB->user_data = NULL;
}

再對(duì) /vglite/VGLite/rtos/vg_lite_os.c 中 vg_lite_os_get_tls()、vg_lite_os_set_tls()、vg_lite_os_reset_tls()修改。原例程調(diào)用了 FreeRTOS 函數(shù)獲取與修改線程本地?cái)?shù)據(jù),而新代碼需手動(dòng)實(shí)現(xiàn),以獲取當(dāng)前線程本地?cái)?shù)據(jù)并讀寫(xiě)數(shù)組第一位元素:
void * vg_lite_os_get_tls() {
    rt_thread_t rt_TCB = rt_thread_self();
    rt_uint32_t * tls_ptr = (rt_uint32_t *) rt_TCB->user_data;
    void * pvReturn = (void *) (*tls_ptr);
    return pvReturn;
}
int32_t vg_lite_os_set_tls(void* tls) {
    rt_thread_t rt_TCB;
    rt_TCB = rt_thread_self();
    RT_ASSERT( rt_TCB != NULL );
    rt_uint32_t * tls_ptr = (rt_uint32_t *) rt_TCB->user_data;
    *tls_ptr = (rt_uint32_t) tls;
}
void vg_lite_os_reset_tls() {
    rt_thread_t rt_TCB = rt_thread_self();
    RT_ASSERT( rt_TCB != NULL );
    rt_uint32_t * tls_ptr = (rt_uint32_t *) rt_TCB->user_data;
    *tls_ptr = NULL;
}

隨后更改工程 /vglite/VGLite/vg_lite.c 中 vg_lite_init(),在調(diào)用 vg_lite_os_get_tls()、vg_lite_os_malloc()、vg_lite_os_set_tls()等函數(shù)之前,添加上文定義的 vg_lite_os_init_tls_array()進(jìn)行線程本地?cái)?shù)據(jù)初始化。同樣,該文件有 vg_lite_close(),在其調(diào)用 vg_lite_os_reset_tls()等函數(shù)的最后,也需添加上文定義的 vg_lite_os_deinit_tls_array()。

11. Elementary API改寫(xiě)

使用 Elementary 時(shí),同樣也需修改工程/elementary/src/elm_os.c 中的 elm_os_get_tls()、 elm_os_set_tls()、elm_os_reset_tls(),以讀寫(xiě)線程本地?cái)?shù)據(jù)中數(shù)組的第二個(gè)元素,與上文 VGLite 的三個(gè)線程本地?cái)?shù)據(jù) API 改寫(xiě)方法基本一致,主要區(qū)別為將使用*(tls_ptr + 1)而非*tls_ptr 。 12. 數(shù)據(jù)類型改寫(xiě)

FreeRTOS 定義了 TickType_t 與 BaseType_t 類型,在 RT1170 中可分別用 rt_uint32_t 與 rt_err_t 代替。同時(shí),可用 RT_NULL 代替 NULL 判斷 RT-Thread 對(duì)象是否為空。

13.輸出 API 改寫(xiě)

若在上篇移植了 Finsh 控制臺(tái)組件,則可用 rt_kprintf()代替 PRINTF 宏。rt_kprintf()已自動(dòng)在字符串末尾添加" " ,無(wú)需再手動(dòng)添加。

結(jié)果驗(yàn)證

編譯并運(yùn)行,若與上篇的原工程結(jié)果相同,即屏幕出現(xiàn)指針不斷旋轉(zhuǎn)的時(shí)鐘,且串口打印幀數(shù)信息。恭喜, VGLite 與 Elementary 已成功移植到 RT-Thread Nano 上啦!

總結(jié)

VGLite 移植到 RT-Thread Nano 的過(guò)程還是有些繁瑣的,需要更改的 FreeRTOS API 較多,但兩個(gè) RTOS 的大部分特性相似度高,難度不大。經(jīng)過(guò)兩篇文章的學(xué)習(xí),相信您對(duì)于 FreeRTOS、RT-Thread 以及 VGLite 的細(xì)節(jié)有了更深入的了解。

此外,若追求移植效率,并不關(guān)心 RTOS 細(xì)節(jié),也可以使用 RT-Thread 的FreeRTOS-Wrapper兼容層替換 FreeRTOS,讀者可以自行進(jìn)行研究。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)注

    1

    文章

    392

    瀏覽量

    28515
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    837

    瀏覽量

    120586
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5389

    瀏覽量

    100984
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    485

    瀏覽量

    63516
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1348

    瀏覽量

    41375

原文標(biāo)題:泄密了! i.MX RT1170:VGLite移植RT-Thread Nano全過(guò)程圖解,這也太詳細(xì)了吧!(下)

文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    i.MX RT1170VGLite移植RT-Thread Nano過(guò)程講解(上)

    RT-Thread 是國(guó)人自主研發(fā)的開(kāi)源實(shí)時(shí)操作系統(tǒng)(RTOS),RT-Thread Nano 是極簡(jiǎn)版的硬實(shí)時(shí)內(nèi)核,內(nèi)存占用小,移植簡(jiǎn)單。VGLi
    的頭像 發(fā)表于 11-09 11:20 ?3200次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b>:<b class='flag-5'>VGLite</b><b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b><b class='flag-5'>過(guò)程</b><b class='flag-5'>講解</b>(上)

    i.MX RT1170車規(guī)級(jí)產(chǎn)品有AEC-Q100認(rèn)證嗎?

    大家好如題,i.MX RT1170車規(guī)級(jí)產(chǎn)品有AEC-Q100認(rèn)證嗎?如果是,能否提供相關(guān)文件?
    發(fā)表于 03-15 08:24

    野火電子基于RT-Threadi.MX RT1052 EVK Pro板卡特點(diǎn)介紹

    RT-Thread合作伙伴野火電子攜RT-Thread Inside板卡i.MX RT1052 EVK Pro參展NXP技術(shù)日,現(xiàn)場(chǎng)展示了多個(gè)基于R
    的頭像 發(fā)表于 07-16 09:44 ?9311次閱讀

    恩智浦i.MX RT1170開(kāi)創(chuàng)GHz MCU時(shí)代

    自2017年上市以來(lái),i.MX RT系列取得了優(yōu)秀的市場(chǎng)表現(xiàn)。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發(fā)表于 03-22 11:14 ?3662次閱讀

    恩智浦i.MX RT1170在將該系列帶上了更高的層面

    自2017年上市以來(lái),i.MX RT系列取得了優(yōu)秀的市場(chǎng)表現(xiàn)。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發(fā)表于 05-18 11:15 ?3975次閱讀

    RT-Thread & NXP 發(fā)布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界處理器系列。該系列又包括 i.MX RT1020、i.MX
    發(fā)表于 12-07 13:06 ?2次下載
    <b class='flag-5'>RT-Thread</b> & NXP 發(fā)布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個(gè) stm32f103 的基礎(chǔ)工程作為示例進(jìn)行講解。 RT-Thre
    發(fā)表于 01-26 17:04 ?17次下載
    基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    如何創(chuàng)建RT-Thread Nano工程

    簡(jiǎn)單(比f(wàn)reeRTOS移植還簡(jiǎn)單)等,本文將講解如何將RT-Thread Nano移植到GD32L233C。
    的頭像 發(fā)表于 03-19 12:13 ?4142次閱讀

    RT-Thread文檔_野火 I.MX RT1052上手指南

    RT-Thread文檔_野火 I.MX RT1052 上手指南
    發(fā)表于 02-22 18:25 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_野火 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT</b>1052上手指南

    RT-Thread文檔_正點(diǎn)原子 I.MX RT1052號(hào)令者上手指南

    RT-Thread文檔_正點(diǎn)原子 I.MX RT1052 號(hào)令者上手指南
    發(fā)表于 02-22 18:26 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_正點(diǎn)原子 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT</b>1052號(hào)令者上手指南

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與<b class='flag-5'>移植</b>

    I.MX RT1170配套PMIC PF5020使用方法

    I.MX RT1170將先進(jìn)的電源管理模塊與DC-DC和LDO集成在一起,可降低外部電源的復(fù)雜性并簡(jiǎn)化電源時(shí)序。
    的頭像 發(fā)表于 04-01 15:54 ?2711次閱讀

    i.MX RT1170評(píng)估套件快速入門:這份保姆級(jí)教程,請(qǐng)收藏!

    恩智浦官網(wǎng)精彩導(dǎo)覽 i.MX RT1170評(píng)估套件快速入門 i.MX RT1170 是恩智浦推出的首款主頻超過(guò)1GHz的跨界MCU,結(jié)合了強(qiáng)悍的計(jì)算能力、多種媒體功能、實(shí)時(shí)功能,以及一
    的頭像 發(fā)表于 05-12 11:55 ?2369次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b>評(píng)估套件快速入門:這份保姆級(jí)教程,請(qǐng)收藏!

    基于NXP微控制器i.MX RT1170的多人體實(shí)時(shí)檢測(cè)算法和系統(tǒng)

    基于NXP微控制器i.MX RT1170的多人體實(shí)時(shí)檢測(cè)算法和系統(tǒng)
    的頭像 發(fā)表于 10-26 16:27 ?1229次閱讀
    基于NXP微控制器<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b>的多人體實(shí)時(shí)檢測(cè)算法和系統(tǒng)

    恩智浦i.MX RT1170 uSDHC eMMC啟動(dòng)時(shí)間

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1170 uSDHC eMMC啟動(dòng)時(shí)間。
    的頭像 發(fā)表于 08-08 15:32 ?945次閱讀
    恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b> uSDHC eMMC啟動(dòng)時(shí)間