色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【項目移植】國民技術N32G4FR開發板:RT-Thread Nano移植FinSH

電子發燒友論壇 ? 來源:未知 ? 2023-02-14 13:00 ? 次閱讀

開發環境:

  • MDK:Keil 5.30

  • 開發板:N32G4FRML-STB 開發板

  • MCU:N32G4FRMEL7

  • RT-Thread版本:3.1.5


FinSH簡介

FinSH是RT-Thread的命令行外殼(shell),提供一套供用戶在命令行的操作接口,主要用于調試、查看系統信息。在大部分嵌入式系統中,一般開發調試都使用硬件調試器和printf日志打印,在有些情況下,這兩種方式并不是那么好用。比如對于RT-Thread這個多線程系統,我們想知道某個時刻系統中的線程運行狀態、手動控制系統狀態。如果有一個shell,就可以輸入命令,直接相應的函數執行獲得需要的信息,或者控制程序的行為。這無疑會十分方便。硬件拓撲結構如下圖所示:



用戶在控制終端輸入命令,控制終端通過串口、USB網絡等方式將命令傳給設備里的 FinSH,FinSH 會讀取設備輸入命令,解析并自動掃描內部函數表,尋找對應函數名,執行函數后輸出回應,回應通過原路返回,將結果顯示在控制終端上。


當使用串口連接設備與控制終端時,FinSH 命令的執行流程,如下圖所示:



FinSH 支持權限驗證功能,系統在啟動后會進行權限驗證,只有權限驗證通過,才會開啟 FinSH 功能,提升系統輸入的安全性。


FinSH 支持自動補全、查看歷史命令等功能,通過鍵盤上的按鍵可以很方便的使用這些功能,FinSH 支持的按鍵如下表所示:



FinSH支持兩種模式,分別是傳統命令行模式和 C 語言解釋器模式:


  1. C語言解釋器模式, 為行文方便稱之為c-style;C 語言解釋器模式下,FinSH 能夠解析執行大部分 C 語言的表達式,并使用類似 C 語言的函數調用方式訪問系統中的函數及全局變量,此外它也能夠通過命令行方式創建變量。在該模式下,輸入的命令必須類似 C 語言中的函數調用方式,即必須攜帶 () 符號,例如,要輸出系統當前所有線程及其狀態,在 FinSH 中輸入 list_thread() 即可打印出需要的信息。FinSH 命令的輸出為此函數的返回值。對于一些不存在返回值的函數(void 返回值),這個打印輸出沒有意義。

  2. 傳統命令行模式,此模式又稱為msh(module shell)。C語言表達式解釋模式下, finsh能夠解析執行大部分C語言的表達式,并使用類似C語言的函數調用方式訪問系統中的函數及全局變量,此外它也能夠通過命令行方式創建變量。在msh模式下,finsh運行方式類似于dos/bash等傳統shell。例如,可以通過 cd / 命令將目錄切換至根目錄。msh 通過解析,將輸入字符分解成以空格區分開的命令和參數。其命令執行格式如下所示:

command [arg1] [arg2] [...]


其中 command 既可以是 RT-Thread 內置的命令,也可以是可執行的文件。


最初 FinSH 僅支持 C-Style 模式,后來隨著 RT-Thread 的不斷發展,C-Style 模式在運行腳本或者程序時不太方便,而使用傳統的 shell 方式則比較方便。另外,C-Style 模式下,FinSH 占用體積比較大。出于這些考慮,在 RT-Thread 中增加了 msh 模式,msh 模式體積小,使用方便,推薦大家使用 msh 模式。


如果在 RT-Thread 中同時使能了這兩種模式,那它們可以動態切換,在 msh 模式下輸入 exit 后回車,即可切換到 C-Style 模式。在 C-Style 模式輸入 msh() 后回車,即可進入 msh 模式。兩種模式的命令不通用,msh 命令無法在 C-Style 模式下使用,反之同理。


FinSH的移植分為兩個部分:第一部分是實現 UART 控制臺,該部分只需要實現兩個函數即可完成 UART 控制臺打印功能。第二部分是實現移植 FinSH 組件,實現在控制臺輸入命令調試系統,該部分實現基于第一部分,只需要添加 FinSH 組件源碼并再對接一個系統函數即可實現。下面將對這兩部分進行說明。


在Nano上添加UART控制臺

在 RT-Thread Nano 上添加 UART 控制臺打印功能后,就可以在代碼中使用 RT-Thread 提供的打印函數 rt_kprintf() 進行信息打印,從而獲取自定義的打印信息,方便定位代碼 bug 或者獲取系統當前運行狀態等。實現控制臺打印,需要完成基本的硬件初始化,以及對接一個系統輸出字符的函數。


2.1 串口初始化

使用串口對接控制臺的打印,首先需要初始化串口,如引腳、波特率等。需要在 board.c 中的 rt_hw_board_init() 函數中調用串口初始化。



2.2 實現 rt_hw_console_output

實現 finsh 組件輸出一個字符,即在該函數中實現 uart 輸出字符:

/*輸出一個字符,系統函數,函數名不可更改 */
void rt_hw_console_output(const char *str);

(左右移動查看全部內容)


示例代碼:如下是基于N32G4FRMEL7的串口驅動對接的 rt_hw_console_output() 函數,實現控制臺字符輸出,示例僅做參考。



以上代碼很簡單,就是將裸機的字符輸出的內容使用rt_hw_console_output()函數實現,筆者使用的是串口1作為調試串口。


注意:RT-Thread 系統中已有的打印均以 結尾,而并非 ,所以在字符輸出時,需要在輸出 之前輸出 ,完成回車與換行,否則系統打印出來的信息將只有換行。


上面實現了rt_hw_console_output()函數,也就實現了rt_kprintf()函數,在kservice.c中調用了rt_hw_console_output()函數。



以下代碼就是在調用rt_hw_console_output()。



RT_CONSOLEBUF_SIZE定義緩沖區的最大長度為,默認配置的大小為128。



2.3 結果驗證

在應用代碼中編寫含有 rt_kprintf() 打印的代碼,編譯下載,打開串口助手進行驗證。如下圖是一個在 main() 函數中每隔 1 秒進行循環打印 Hello RT-Thread 的示例效果:



在Nano上添加FinSH組件

RT-Thread FinSH 是 RT-Thread 的命令行組件(shell),提供一套供用戶在命令行調用的操作接口,主要用于調試或查看系統信息。它可以使用串口 / 以太網 / USB 等與 PC 機進行通信,使用 FinSH 組件基本命令的效果圖如下所示。



本文以串口 UART 作為 FinSH 的輸入輸出端口與 PC 進行通信,描述如何在 Nano 上實現 FinSH shell 功能。


在 RT-Thread Nano 上添加 FinSH 組件,實現 FinSH 功能的步驟主要如下:

  1. 添加 FinSH 源碼到工程。

  2. 實現函數對接。

  3. 1 Keil添加 FinSH 源碼工程


把 FinSH 組件的源碼到工程。



另外還需要配置Finsh的頭文件路徑。



3.2 實現 rt_hw_console_getchar

要實現 FinSH 組件功能:既可以打印也能輸入命令進行調試,控制臺已經實現了打印功能,現在還需要在 board.c 中對接控制臺輸入函數,實現字符輸入:

/* finsh 獲取一個字符,系統函數,函數名不可更改 */
char rt_hw_console_getchar(void)

(左右移動查看全部內容)


rt_hw_console_getchar():控制臺獲取一個字符,即在該函數中實現 uart 獲取字符,可以使用查詢方式獲取(注意不要死等,在未獲取到字符時,需要讓出 CPU),也可以使用中斷方式獲取。


3.2.1查詢方式

如下是基于N32G4FRMEL7的串口驅動對接的 rt_hw_console_getchar(),完成對接 FinSH 組件,其中獲取字符采用查詢方式,示例僅做參考。

/* 移植 FinSH,實現命令行交互, 需要添加 FinSH 源碼,然后再對接 rt_hw_console_getchar */
char rt_hw_console_getchar(void)
{
int ch = -1;
if (USART_GetFlagStatus(USART1, USART_FLAG_RXDNE) != RESET)
{
ch = (int)USART_ReceiveData(USART1);
}
else
{
if(USART_GetFlagStatus(USART1, USART_FLAG_OREF) != RESET)
{
USART_ClrFlag(USART1,USART_FLAG_TXC);
}
rt_thread_mdelay(10);
}
return ch;
}

(左右移動查看全部內容)


3.2.2 中斷方式

如下是基于 N32G4FRMEL7串口驅動,實現控制臺輸出與 FinSH Shell,其中獲取字符采用中斷方式。原理是,在 uart 接收到數據時產生中斷,在中斷中把數據存入 ringbuffer 緩沖區,然后釋放信號量,tshell 線程接收信號量,然后讀取存在 ringbuffer 中的數據。

/* 第一部分:ringbuffer 實現部分 */
#include
#include


#define rt_ringbuffer_space_len(rb) ((rb)->buffer_size - rt_ringbuffer_data_len(rb))


struct rt_ringbuffer
{
rt_uint8_t *buffer_ptr;


rt_uint16_t read_mirror : 1;
rt_uint16_t read_index : 15;
rt_uint16_t write_mirror : 1;
rt_uint16_t write_index : 15;


rt_int16_t buffer_size;
};


enum rt_ringbuffer_state
{
RT_RINGBUFFER_EMPTY,
RT_RINGBUFFER_FULL,
/* half full is neither full nor empty */
RT_RINGBUFFER_HALFFULL,
};


rt_inline enum rt_ringbuffer_state rt_ringbuffer_status(struct rt_ringbuffer *rb)
{
if (rb->read_index == rb->write_index)
{
if (rb->read_mirror == rb->write_mirror)
return RT_RINGBUFFER_EMPTY;
else
return RT_RINGBUFFER_FULL;
}
return RT_RINGBUFFER_HALFFULL;
}


/**
* get the size of data in rb
*/
rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer *rb)
{
switch (rt_ringbuffer_status(rb))
{
case RT_RINGBUFFER_EMPTY:
return 0;
case RT_RINGBUFFER_FULL:
return rb->buffer_size;
case RT_RINGBUFFER_HALFFULL:
default:
if (rb->write_index > rb->read_index)
return rb->write_index - rb->read_index;
else
return rb->buffer_size - (rb->read_index - rb->write_index);
};
}


void rt_ringbuffer_init(struct rt_ringbuffer *rb,
rt_uint8_t *pool,
rt_int16_t size)
{
RT_ASSERT(rb != RT_NULL);
RT_ASSERT(size > 0);


/* initialize read and write index */
rb->read_mirror = rb->read_index = 0;
rb->write_mirror = rb->write_index = 0;


/* set buffer pool and size */
rb->buffer_ptr = pool;
rb->buffer_size = RT_ALIGN_DOWN(size, RT_ALIGN_SIZE);
}


/**
* put a character into ring buffer
*/
rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch)
{
RT_ASSERT(rb != RT_NULL);


/* whether has enough space */
if (!rt_ringbuffer_space_len(rb))
return 0;


rb->buffer_ptr[rb->write_index] = ch;


/* flip mirror */
if (rb->write_index == rb->buffer_size-1)
{
rb->write_mirror = ~rb->write_mirror;
rb->write_index = 0;
}
else
{
rb->write_index++;
}


return 1;
}
/**
* get a character from a ringbuffer
*/
rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch)
{
RT_ASSERT(rb != RT_NULL);


/* ringbuffer is empty */
if (!rt_ringbuffer_data_len(rb))
return 0;


/* put character */
*ch = rb->buffer_ptr[rb->read_index];


if (rb->read_index == rb->buffer_size-1)
{
rb->read_mirror = ~rb->read_mirror;
rb->read_index = 0;
}
else
{
rb->read_index++;
}


return 1;
}


/* 第二部分:finsh 移植對接部分 */
#define UART_RX_BUF_LEN 16
rt_uint8_t uart_rx_buf[UART_RX_BUF_LEN] = {0};
struct rt_ringbuffer uart_rxcb; /* 定義一個 ringbuffer cb */
static struct rt_semaphore shell_rx_sem; /* 定義一個靜態信號量 */


/**
* [url=home.php?mod=space&uid=2666770]@Brief[/url] 配置USART接收中斷
* [url=home.php?mod=space&uid=3142012]@param[/url] uint8_t IRQChannel, uint8_t PreemptionPriority, uint8_t SubPriority
* @retval None
*/
static void BSP_USART_NVIC_Configuration(uint8_t IRQChannel, uint8_t PreemptionPriority, uint8_t SubPriority)
{
NVIC_InitType NVIC_InitStructure;


/* Enable the USARTy Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


/**
* @brief USART GPIO 配置
* @param ST_BSP_USART_Dev *BSP_USART_Dev, uint32_t BaudRate, uint8_t PreemptionPriority, uint8_t SubPriority
* @retval None
*/
void BSP_USART_Init(ST_BSP_USART_Dev *BSP_USART_Dev, uint32_t BaudRate, uint8_t PreemptionPriority, uint8_t SubPriority)
{
GPIO_InitType GPIO_InitStructure;
USART_InitType USART_InitStructure;


/* config USART GPIO clock */
RCC_EnableAPB2PeriphClk(BSP_USART_Dev->usart_rx_gpio_clk | BSP_USART_Dev->usart_tx_gpio_clk, ENABLE);


/* config USART clock */
RCC_EnableAPB2PeriphClk(BSP_USART_Dev->usart_clk, ENABLE);


/* 初始化串口接收 ringbuffer */
rt_ringbuffer_init(&uart_rxcb, uart_rx_buf, UART_RX_BUF_LEN);


/* 初始化串口接收數據的信號量 */
rt_sem_init(&(shell_rx_sem), "shell_rx", 0, 0);


/* USART GPIO config */
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.Pin = BSP_USART_Dev->usart_tx_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(BSP_USART_Dev->usart_tx_port, &GPIO_InitStructure);
/* Configure USART Rx as input floating */
GPIO_InitStructure.Pin = BSP_USART_Dev->usart_rx_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitPeripheral(BSP_USART_Dev->usart_rx_port, &GPIO_InitStructure);


USART_DeInit(BSP_USART_Dev->usart);
/* USART mode config */
USART_InitStructure.BaudRate = BaudRate;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO ;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
USART_Init(BSP_USART_Dev->usart, &USART_InitStructure);


// 配置中斷
BSP_USART_NVIC_Configuration(BSP_USART_Dev->usart_irqn, PreemptionPriority, SubPriority);
/* 使能串口接收中斷 */
USART_ConfigInt(BSP_USART_Dev->usart, USART_INT_RXDNE, ENABLE);
//USART_ConfigInt(BSP_USART_Dev->usart, USART_INT_IDLEF, ENABLE); // 空閑中斷


USART_Enable(BSP_USART_Dev->usart, ENABLE);
}




/*輸出一個字符,系統函數,函數名不可更改 */
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = ' ';

/*清楚標志位*/
USART_ClrFlag(USART1,USART_FLAG_TXC);

size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == ' ')
{
/* 發送一個字節數據到USART1 */
USART_SendData(USART1, (uint8_t) a);
/* 等待發送完畢 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TXC) == RESET);
}
/* 發送一個字節數據到USART1 */
USART_SendData(USART1, (uint8_t) *(str+i));
/* 等待發送完畢 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TXC) == RESET);
}
}


/* 移植 FinSH,實現命令行交互, 需要添加 FinSH 源碼,然后再對接 rt_hw_console_getchar */
/* 中斷方式 */
char rt_hw_console_getchar(void)
{
char ch = 0;


/* 從 ringbuffer 中拿出數據 */
while (rt_ringbuffer_getchar(&uart_rxcb, (rt_uint8_t *)&ch) != 1)
{
rt_sem_take(&shell_rx_sem, RT_WAITING_FOREVER);
}
return ch;
}


/* 第三部分:中斷部分*/
void USART1_IRQHandler(void)
{
int ch = -1;

/* enter interrupt */
rt_interrupt_enter(); //在中斷中一定要調用這對函數,進入中斷

if( (USART_GetIntStatus(USART1, USART_INT_RXDNE) != RESET) && (USART_GetFlagStatus(USART1, USART_FLAG_RXDNE) != RESET) )
{
while (1)
{
ch = -1;
if(USART_GetIntStatus(USART1, USART_INT_RXDNE) != RESET)
{
ch = USART_ReceiveData(USART1);
}
if(ch ==-1)
{
break;
}
/* 讀取到數據,將數據存入 ringbuffer */
rt_ringbuffer_putchar(&uart_rxcb, ch);
}
rt_sem_release(&shell_rx_sem);
}
/* leave interrupt */
rt_interrupt_leave(); //在中斷中一定要調用這對函數,離開中斷
}

(左右移動查看全部內容)


【注】需要確認 rtconfig.h 中已使能 RT_USING_CONSOLE 宏定義


移植完成后,將程序下載到板子中,打開串口助手,在發送去輸入字符,點擊發送即可進行交互。注意一定要有換行符。



這里推薦使用xshell等工具,用起來就有種Linux終端的感覺。



FinSH實例

前文移植了FinSH,接下來我門通過一個實例來講解如果使用自定義 msh 命令。本節我們來讀取芯片閃存容量寄存器和芯片ID,寄存器地址描述如下:


  • 存儲器容量寄存器



  • 產品唯一身份標識寄存器(96位)


產品唯一的身份標識應用如下:

  • 用來作為序列號(例如USB字符序列號或者其他的終端應用)

  • 用來作為密碼,在編寫閃存時,將此唯一標識與軟件加解密算法結合使用,提高代碼在閃存存儲器內的安全性。

  • 用來激活帶安全機制的自舉過程


96位的產品唯一身份標識所提供的參考號碼對任意一個STM32微控制器,在任何情況下都是唯一的。用戶在何種情況下,都不能修改這個身份標識。


這個96位的產品唯一身份標識,按照用戶不同的用法,可以以字節(8位)為單位讀取,也可以以半字(16位)或者全字(32位)。


實現讀取芯片閃存容量寄存器和芯片ID很簡單,代碼如下:

uint32_t ChipUniqueID[3];


void GetChipID(void)
{
ChipUniqueID[0] = *(volatile uint32_t *)(0x1FFFF7F0);//ID最高位
ChipUniqueID[1] = *(volatile uint32_t *)(0x1FFFF7EC);//ID最高位
ChipUniqueID[2] = *(volatile uint32_t *)(0x1FFFF7E8);//ID最高位


rt_kprintf(" Chip ID id:0x%08X-0x%08X-0x%08X ",ChipUniqueID[0],ChipUniqueID[1],ChipUniqueID[2]);
}


MSH_CMD_EXPORT(GetChipID, Get 96 bit unique chip ID);


void GetFlashCapactity(void)
{
rt_kprintf(" Chip flash capacity is:%dK ",*(volatile uint16_t *)(0x1FFFF7E0));
}


MSH_CMD_EXPORT(GetFlashCapactity, Get Chip flash capacity);

(左右移動查看全部內容)


這里需要關注宏定義MSH_CMD_EXPORT,我們在Finsh命令行中就可調用我們自定義的命令,如下所示:



從結果可以看出閃存存儲器容量是512K,芯片唯一序列號是:39FFDF054E42323210611451,以上結果是完全符合預期的。



本文由電子發燒友社區發布,轉載請注明以上來源。如需社區合作及入群交流,請添加微信EEFans0806,或者發郵箱liuyong@huaqiu.com



熱門推薦干貨好文


1、社區精選!PCB多層板設計挑戰賽作品集合

2、超強性能AI芯片,OpenHarmony多系統支持,可定制高性能AP(附10+開發Demo)

3、從零入門物聯網OH開源平臺,從簡單到高階項目,創客電子愛好者都愛用!

4、低成本ESP32方案,支持OpenHarmony系統開發(附10+項目樣例Demo)

5、從0到1玩轉瑞薩RA4系列開發板,教你變著花樣玩板子

6、四核64位,超強CPU ,看RK3568“競”開發板DEMO!

7、人工智能也能這么玩, 簡單快速入手,還能自定義AI運算

8、業界首款!支持富設備開發,OpenHarmony開發者都選它!

9、高性能雙核RISC-V,滿足大多數開發,這款國產MCU工程師都愛


原文標題:【項目移植】國民技術N32G4FR開發板:RT-Thread Nano移植FinSH

文章出處:【微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴

原文標題:【項目移植】國民技術N32G4FR開發板:RT-Thread Nano移植FinSH

文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來
    的頭像 發表于 11-13 01:03 ?1242次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動!

    親愛的RT-Thread開發者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發
    的頭像 發表于 10-29 08:06 ?437次閱讀
    開源共生 商業共贏 | <b class='flag-5'>RT-Thread</b> 2024<b class='flag-5'>開發</b>者大會報名啟動!

    Nordic-RT-Thread5.1.0移植筆記

    Nordic-RT-Thread5.1.0移植筆記
    的頭像 發表于 10-16 08:09 ?493次閱讀
    Nordic-<b class='flag-5'>RT-Thread</b>5.1.0<b class='flag-5'>移植</b>筆記

    NXP FRDM-MCXC444開發板RT-Thread環境下的上手過程

    NXP FRDM-MCXC444開發板是一款基于MCX C444 MCU的高性能開發板,它集成了豐富的硬件資源和接口,支持快速原型設計。本文將為讀者提供一份詳細的RT-Thread上手指南,幫助大家輕松玩轉這款
    的頭像 發表于 10-12 11:51 ?428次閱讀
    NXP FRDM-MCXC444<b class='flag-5'>開發板</b>在<b class='flag-5'>RT-Thread</b>環境下的上手過程

    如何在RT-thread studio的裸機例程上移植freertos?

    如何在RT-thread studio的裸機例程上移植freertos
    發表于 09-13 06:32

    【QEMU系列】不用開發板運行RT-Thread指南-ARM架構

    簡介在物聯網和嵌入式系統的開發中,RT-Thread操作系統憑借其小巧、高效和靈活的特點,受到了越來越多開發者的青睞。然而,對于很多剛剛接觸RT-Thread
    的頭像 發表于 08-09 08:35 ?973次閱讀
    【QEMU系列】不用<b class='flag-5'>開發板</b>運行<b class='flag-5'>RT-Thread</b>指南-ARM架構

    【好書推薦】RT-Thread設備驅動開發指南

    近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需
    的頭像 發表于 08-01 08:35 ?663次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設備驅動<b class='flag-5'>開發</b>指南

    lvgl移植RT-Thread Nano后進入硬件錯誤中斷的原因?

    使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因為這個lvgl只能移植到標準版里? 嘗試過給lvgl的線程分配更大的棧,但是依舊會卡死在硬件錯誤中斷里。但只要把
    發表于 07-04 07:40

    先楫半導體所有開發板已上RT-Thread主線啦

    目前,先楫半導體在RT-Thread主線支持的開發板包含以下這些
    的頭像 發表于 06-05 08:17 ?589次閱讀
    先楫半導體所有<b class='flag-5'>開發板</b>已上<b class='flag-5'>RT-Thread</b>主線啦

    2024 RT-Thread 全球技術大會演講議程發布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術大會)致力于圍繞RT-Thread
    的頭像 發表于 05-16 08:34 ?565次閱讀
    2024 <b class='flag-5'>RT-Thread</b> 全球<b class='flag-5'>技術</b>大會演講議程發布!

    4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Threa
    的頭像 發表于 04-16 08:35 ?431次閱讀
    <b class='flag-5'>4</b>月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread
    的頭像 發表于 03-27 11:36 ?836次閱讀
    <b class='flag-5'>4</b>月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread
    的頭像 發表于 03-27 08:34 ?542次閱讀
    <b class='flag-5'>4</b>月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    如何在PSoC62 Evaluation kit開發板上運行RT-Thread呢?

    本文主要介紹如何在PSoC62 Evaluation kit開發板上運行RT-Thread,如何連接CYW43012 WiFi藍牙模組,以及如何進行WiFi聯網、網絡延遲、網絡帶寬測試。
    的頭像 發表于 02-27 10:49 ?1041次閱讀
    如何在PSoC62 Evaluation kit<b class='flag-5'>開發板</b>上運行<b class='flag-5'>RT-Thread</b>呢?

    移植RT-THREAD在stm32開發板上,使用rt_kprintf不能正常打印的原因是什么?怎么解決?

    ) 問題: 復位開發板RT-Thread 標志也沒有打印出來。 1、使用print可以打印; 2、使用內置的rt_kprintf 不能打印; 測試代碼: 放在主函數的while(1)下
    發表于 02-20 06:24
    主站蜘蛛池模板: 九九99热久久999精品| 99久久免热在线观看| 久久99re8热在线播放| 99精品欧美一区二区三区美图| 涩涩电影网| 久久亚洲高清观看| 国产色欲一区二区精品久久呦| 97夜夜澡人人爽人人模人人喊 | 欧美16一17sex性hd| 国产亚洲美女精品久久久2020 | 观赏女性排尿| 99久久亚洲精品影院| 一级毛片两人添下面| 亚州AV中文无码乱人伦在线| 日韩欧美精品有码在线播放免费| 麻豆官网入口| 久久国产精品高清一区二区三区| 国产日韩久久久精品影院首页| 俄罗斯14一18处交| 99久久久无码国产精精品| 中国农村妇女真实BBWBBWBBW| 亚洲欧洲一级| 羞羞影院午夜男女爽爽免费| 丝袜美女自摸| 帅哥男男GV在线1080P| 日本学生VIDEOVIDEOS更新| 欧美激情精品久久久久| 免费。色婬网站| 毛片免费观看视频| 久久亚洲一级α片| 久久久久国产| 久久久久久久久久综合情日本 | 果冻传媒2021一二三在线观看| 国产精品久久久久久亚洲毛片| 国产成人精品电影在线观看| 德国黄色录像| 成人手机在线| 调教美丽的白丝袜麻麻视频| 成人毛片免费播放| 成人网站国产在线视频内射视频| yellow免费影视大全|