vesperW · 2月6日

利用 Deepseek 学习嵌入式技术,合适吗?

春节前后,DeepSeek 着实火了一把,朋友圈也是刷爆了(不知道你朋友圈有没有关于 Deepseek 的消息?)。

以前,我习惯性用百度/谷歌搜索问题,但是,自 ChatGPT 出来,我就不再依赖百度/谷歌了(当然,很多时候也会用)。

国内外这种 AI 工具有很多,特别是国内涌现出了一大批类似 AI 工具,像:文心一言、Kimi、豆包、通义千问、讯飞星火等。可能有些人没有梯子,国外 ChatGPT 这类工具没办法使用,国内这些工具就是首选。

国内的 AI 工具确实很多,但在 DeepSeek  问世之前,国内的这些工具,说实话,和 ChatGPT 还是有一定差距,用来问些嵌入式技术相关的问题,出来的答案,总有一股“AI 味”

image.png

在春节假期,我也试着在  DeepSeek 上问了一些嵌入式相关的问题,给出的答案,会明显的比国内其他工具要好的多。那么,利用 Deepseek 学习嵌入式技术,合适吗?

我的答案是:合适。

比如问:学习嵌入式的路线

Image

像这类指导性的问题,它给的答案虽然和文心一言、Kimi 回答有点类似,但它还给出了“拓展的内容”。当然,这类问题,DeepSeek 优势不明显。

再来一个问题:基于单片机以及 RTOS 写一段串口收发的代码,其中包含通信协议,这个问题,DeepSeek 给出的答案就相对更有优势:

Image

代码实现:

#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: // 等待起始字节
                    if (rx_byte == START_BYTE) {
                        state = 1;
                    }
                    break;

                case 1: // 读取长度
                    rx_frame.length = rx_byte;
                    checksum = rx_byte;
                    state = 2;
                    index = 0;
                    break;

                case 2: // 读取数据
                    rx_frame.data[index++] = rx_byte;
                    checksum += rx_byte;
                    if (index >= rx_frame.length) {
                        state = 3;
                    }
                    break;

                case 3: // 读取校验和
                    rx_frame.checksum = rx_byte;
                    if (checksum == rx_frame.checksum) {
                        // 校验成功,处理数据
                        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) {
            // 发送起始字节
            USART_SendData(USART1, START_BYTE);
            while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

            // 发送长度
            USART_SendData(USART1, tx_frame.length);
            while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

            // 发送数据
            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);
            }

            // 计算并发送校验和
            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) {
    // 在这里处理接收到的数据帧
    // 例如:打印数据、响应命令等
}

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) {
    // 初始化硬件和外设
    USART_Init();
    NVIC_Init();

    // 创建队列
    uart_rx_queue = xQueueCreate(UART_RX_QUEUE_SIZE, sizeof(uint8_t));
    uart_tx_queue = xQueueCreate(UART_TX_QUEUE_SIZE, sizeof(uart_frame_t));

    // 创建任务
    xTaskCreate(uart_rx_task, "UART_RX", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    xTaskCreate(uart_tx_task, "UART_TX", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    // 启动调度器
    vTaskStartScheduler();

    while (1);
}

Image

同样的问题,DeepSeek 和国内其他 AI 工具给出的答案可能近似,但 DeepSeek 会列举得更详细,而且更具有可读性。

就好比一段代码,实现的功能相同,但你的代码像一坨屎,而 DeepSeek 的代码规范完整,而且可读性、可移植性更好。

当然,以上只列举了其中一两点,我也尝试问了很多类似的问题,并进行对比,如果说满分 100 分,国内其他 AI 工具(文心一言、Kimi)有 80 分,那么,DeepSeek 我给 90 分。

DeepSeek 让特朗普都站出来说了话,让央视新闻等国内几家头部媒体都进行了报道,说明 DeepSeek 确实有两把刷子。当然,从使用者的角度,DeepSeek 也确实很不错。

最后,你们用上了 DeepSeek 吗?

END

作者:strongerHuang
来源:strongerHuang

推荐阅读

欢迎大家点赞留言,更多Arm技术文章动态请关注极术社区嵌入式客栈专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
2909
内容数
330
分享一些在嵌入式应用开发方面的浅见,广交朋友
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息