春節(jié)前后,DeepSeek著實(shí)火了一把,朋友圈也是刷爆了(不知道你朋友圈有沒有關(guān)于Deepseek的消息?)。
以前,我習(xí)慣性用百度/谷歌搜索問題,但是,自ChatGPT出來,我就不再依賴百度/谷歌了(當(dāng)然,很多時(shí)候也會(huì)用)。
國(guó)內(nèi)外這種 AI 工具有很多,特別是國(guó)內(nèi)涌現(xiàn)出了一大批類似 AI 工具,像:文心一言、Kimi、豆包、通義千問、訊飛星火等??赡苡行┤藳]有梯子,國(guó)外ChatGPT這類工具沒辦法使用,國(guó)內(nèi)這些工具就是首選。
國(guó)內(nèi)的 AI 工具確實(shí)很多,但在 DeepSeek 問世之前,國(guó)內(nèi)的這些工具,說實(shí)話,和 ChatGPT 還是有一定差距,用來問些嵌入式技術(shù)相關(guān)的問題,出來的答案,總有一股“AI味”
在春節(jié)假期,我也試著在?DeepSeek 上問了一些嵌入式相關(guān)的問題,給出的答案,會(huì)明顯的比國(guó)內(nèi)其他工具要好的多。那么,利用Deepseek學(xué)習(xí)嵌入式技術(shù),合適嗎?
我的答案是:合適。
比如問:學(xué)習(xí)嵌入式的路線
像這類指導(dǎo)性的問題,它給的答案雖然和文心一言、Kimi回答有點(diǎn)類似,但它還給出了“拓展的內(nèi)容”。當(dāng)然,這類問題,DeepSeek優(yōu)勢(shì)不明顯。
再來一個(gè)問題:基于單片機(jī)以及RTOS寫一段串口收發(fā)的代碼,其中包含通信協(xié)議,這個(gè)問題,DeepSeek給出的答案就相對(duì)更有優(yōu)勢(shì):
代碼實(shí)現(xiàn):
#include "stm32f4xx.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "usart.h"
#define START_BYTE 0xAA
#define UART_RX_QUEUE_SIZE 128
#define UART_TX_QUEUE_SIZE 128
QueueHandle_t uart_rx_queue;
QueueHandle_t uart_tx_queue;
typedef struct {
uint8_t length;
uint8_t data[256];
uint8_t checksum;
} uart_frame_t;
void uart_rx_task(void *pvParameters) {
uint8_t rx_byte;
uart_frame_t rx_frame;
uint8_t state = 0;
uint8_t index = 0;
uint8_t checksum = 0;
while (1) {
if (xQueueReceive(uart_rx_queue, &rx_byte, portMAX_DELAY) == pdPASS) {
switch (state) {
case 0: // 等待起始字節(jié)
if (rx_byte == START_BYTE) {
state = 1;
}
break;
case 1: // 讀取長(zhǎng)度
rx_frame.length = rx_byte;
checksum = rx_byte;
state = 2;
index = 0;
break;
case 2: // 讀取數(shù)據(jù)
rx_frame.data[index++] = rx_byte;
checksum += rx_byte;
if (index >= rx_frame.length) {
state = 3;
}
break;
case 3: // 讀取校驗(yàn)和
rx_frame.checksum = rx_byte;
if (checksum == rx_frame.checksum) {
// 校驗(yàn)成功,處理數(shù)據(jù)
process_rx_frame(&rx_frame);
}
state = 0;
break;
default:
state = 0;
break;
}
}
}
}
void uart_tx_task(void *pvParameters) {
uart_frame_t tx_frame;
while (1) {
if (xQueueReceive(uart_tx_queue, &tx_frame, portMAX_DELAY) == pdPASS) {
// 發(fā)送起始字節(jié)
USART_SendData(USART1, START_BYTE);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
// 發(fā)送長(zhǎng)度
USART_SendData(USART1, tx_frame.length);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
// 發(fā)送數(shù)據(jù)
for (uint8_t i = 0; i < tx_frame.length; i++) {
USART_SendData(USART1, tx_frame.data[i]);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
// 計(jì)算并發(fā)送校驗(yàn)和
uint8_t checksum = tx_frame.length;
for (uint8_t i = 0; i < tx_frame.length; i++) {
checksum += tx_frame.data[i];
}
USART_SendData(USART1, checksum);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}
}
void process_rx_frame(uart_frame_t *frame) {
// 在這里處理接收到的數(shù)據(jù)幀
// 例如:打印數(shù)據(jù)、響應(yīng)命令等
}
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
uint8_t rx_byte = USART_ReceiveData(USART1);
xQueueSendFromISR(uart_rx_queue, &rx_byte, NULL);
}
}
int main(void) {
// 初始化硬件和外設(shè)
USART_Init();
NVIC_Init();
// 創(chuàng)建隊(duì)列
uart_rx_queue = xQueueCreate(UART_RX_QUEUE_SIZE, sizeof(uint8_t));
uart_tx_queue = xQueueCreate(UART_TX_QUEUE_SIZE, sizeof(uart_frame_t));
// 創(chuàng)建任務(wù)
xTaskCreate(uart_rx_task, "UART_RX", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(uart_tx_task, "UART_TX", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
// 啟動(dòng)調(diào)度器
vTaskStartScheduler();
while (1);
}
同樣的問題,DeepSeek和國(guó)內(nèi)其他AI工具給出的答案可能近似,但DeepSeek會(huì)列舉得更詳細(xì),而且更具有可讀性。
就好比一段代碼,實(shí)現(xiàn)的功能相同,但你的代碼像一坨屎,而DeepSeek的代碼規(guī)范完整,而且可讀性、可移植性更好。
當(dāng)然,以上只列舉了其中一兩點(diǎn),我也嘗試問了很多類似的問題,并進(jìn)行對(duì)比,如果說滿分100分,國(guó)內(nèi)其他AI工具(文心一言、Kimi)有80分,那么,DeepSeek我給90分。
DeepSeek讓特朗普都站出來說了話,讓央視新聞等國(guó)內(nèi)幾家頭部媒體都進(jìn)行了報(bào)道,說明DeepSeek確實(shí)有兩把刷子。當(dāng)然,從使用者的角度,DeepSeek也確實(shí)很不錯(cuò)。
最后,你們用上了 DeepSeek 嗎?