从单片机到Linux驱动:嵌入式工程师的实战成长指南

嵌入式工程师技术成长路径:从单片机到Linux驱动开发 嵌入式系统开发是连接硬件与软件的关键技术领域,其核心在于通过专用计算机系统实现特定功能。从技术原理看,嵌入式开发遵循从底层硬件驱动到上层应用的完整技术栈,涉及计算机体系结构、实时系统、Linux内核等核心技术。在工程实践中,嵌入式开发的价值体现在物联网设备、工业控制、智能硬件等广泛应用场景。随着技术演进,开发者通常经历单片机开发、Linux应用开发到驱动开发的成长路径,其中驱动开发需要深入理解硬件时序、内核机制等关键技术。掌握STM32微控制器和Linux设备树(DTS)配置成为职业发展的关键里程碑,这些技 阅读详情

从单片机到Linux驱动:嵌入式工程师的实战成长指南

你是否曾盯着开发板上闪烁的LED灯,心里却想着Linux内核里那些复杂的驱动框架?从点亮第一个单片机LED,到让一块复杂的ARM板卡在Linux下流畅运行,这中间的路径,远不止是技术栈的简单叠加。它更像是一场思维模式的蜕变,一次从“控制者”到“协作者”的身份转换。这篇文章,就是为你——那位已经熟悉51、STM32,能玩转FreeRTOS,却对Linux内核望而生畏的嵌入式开发者——准备的一份实战地图。我们不谈空洞的理论,只聚焦于那些在真实项目中,从单片机思维跨越到Linux驱动开发所必须攻克的关卡、绕开的深坑,以及那些书本上很少提及的“手感”和经验。

1. 思维重塑:从“裸奔”到“与内核共舞”

很多工程师在单片机领域游刃有余,但一接触Linux驱动就感到水土不服。这背后的核心障碍,往往不是某个具体的API,而是开发范式的根本性转变。

在单片机的世界里,你通常是绝对的“上帝”。主函数main()是你的起点,你可以直接操作寄存器,用while(1)大循环掌控一切时序,中断服务函数里你想干嘛就干嘛(当然,得快点出来)。这种“裸奔”或基于简单RTOS的开发,给予开发者极大的直接控制权,但也意味着所有的资源管理、任务调度、错误处理都得亲力亲为。

而一旦进入Linux的世界,你立刻从“上帝”降格为内核的“合作者”。你的驱动代码运行在内核空间,必须严格遵守内核定下的规矩:你不能想while死循环就死循环(那会卡死整个系统),不能随意使用printf(得用printk),内存分配和释放必须成对且小心(否则就是内存泄漏或内核崩溃)。你的代码不再是程序的全部,而是变成了内核这个庞大生态系统中的一个插件。

这里有个关键心态要调整:在Linux驱动开发中,你的首要任务不是“实现功能”,而是“正确地向内核注册自己,并妥善响应内核的调用”。功能是在这个框架下自然实现的。

为了更直观地理解这种差异,我们来看一个最简单的“点亮LED”操作在两种环境下的代码逻辑对比:

对比维度单片机 (以STM32 HAL库为例)Linux 驱动 (字符设备框架)
控制核心直接配置GPIO寄存器或调用HAL库函数。实现file_operations结构体中的open, write等回调函数,由内核在应用层调用write()时触发。
程序入口main()函数,顺序执行初始化。模块的init_module() (或module_init) 函数,向内核注册设备。
资源管理手动管理,需注意初始化顺序。遵循内核的设备模型,常使用platform_device/platform_driver进行匹配和资源获取(如通过设备树)。
与应用的交互通常没有标准接口,自定义通信协议。通过标准的文件IO接口 (/dev/led),应用层使用open, read, write, ioctl等标准系统调用。
并发考虑需自己处理中断与主循环的共享数据(如关中断)。必须考虑多进程/线程同时访问驱动,需使用内核提供的互斥锁(mutex)、信号量等机制。
调试方式仿真器单步调试、串口打印。printk输出到内核日志(dmesg),proc或sysfs文件系统,内核调试器(kgdb)。

这张表清晰地揭示了一个事实:在Linux下写驱动,你是在用内核提供的“乐高积木”搭建一个符合规范的接口,而不是自己从零烧制陶土。接受并理解这套规则,是进阶的第一步。

2. 技能栈的纵深拓展:不止于API调用

从单片机到Linux驱动的路径,技能树需要横向拓宽,更需要纵向深挖。它不是一个替换过程,而是一个叠加和融合的过程。

2.1 C语言的“内核级”修炼

你以为精通了单片机C语言就够了吗?在内核里,C语言被用到了另一种境界。这里充斥着大量的宏、内联函数、函数指针和复杂的数据结构。比如,随处可见的container_of宏,是理解内核链表的关键:

// 这是一个经典的内核宏,用于通过结构体成员的指针找到其所属结构体的指针
#define container_of(ptr, type, member) ({ \
    const typeof(((type *)0)->member) *__mptr = (ptr); \
    (type *)((char *)__mptr - offsetof(type, member)); })

看不懂?没关系,刚开始所有人都一头雾水。它的妙处在于,内核的链表list_head通常被嵌入到业务结构体中,遍历链表时,通过这个宏就能轻松拿到外层结构体的数据。这种“侵入式”链表设计,体现了内核追求极致效率和灵活性的思想。你需要花时间去理解这些惯用法,而不仅仅是记住语法。

此外,内存管理从malloc/free变成了kmalloc/kfree、vmalloc/vfree,并且要深刻理解内存泄漏和内存越界在内核中导致的灾难性后果(直接Oops或死机)。指针和内存操作必须更加谨慎。

2.2 操作系统的“感性认识”

在单片机上用FreeRTOS,你理解了任务、队列、信号量。这非常好,是宝贵的基础。进入Linux,你需要将这种理解升维。

  • 进程与线程:在应用层,它们是编程模型;在驱动层,它们是并发访问的来源。你的驱动必须假设会有多个进程的多个线程同时调用read、write。
  • 虚拟内存:这是与单片机物理内存直接映射完全不同的概念。内核空间和用户空间的内存隔离,导致了拷贝的必要性(比如copy_from_user/copy_to_user)。不理解这个,就无法理解为什么用户态传过来的指针不能直接解引用。
  • 中断下半部:单片机中断要求快进快出。Linux内核将中断处理分为顶半部(紧急处理)和底半部(延后处理),提供了tasklet、workqueue等机制。这直接解决了驱动中“中断处理时间过长”的问题。

我建议的一个实践方法是:在深入学习驱动前,先写一些复杂的Linux用户空间程序。比如,用多线程+信号量实现一个生产者-消费者模型,用epoll实现一个高并发的网络服务器。当你对上层机制有切身体会后,再去看内核是如何支撑这些机制的,会豁然开朗。

2.3 硬件理解的“抽象化”迁移

单片机开发中,你常直接看芯片手册,操作寄存器。在Linux驱动中,这种关系被抽象化和标准化了。

  1. 设备树(Device Tree):这是现代Linux嵌入式开发的核心。硬件信息(如寄存器地址、中断号、引脚配置)不再硬编码在驱动代码里,而是写在.dts文件中。驱动通过内核API从设备树中获取这些资源。这实现了驱动代码和硬件配置的分离,同一份驱动源码可以适配不同板卡。
    // 在驱动代码中获取设备树中定义的资源示例
    static int my_driver_probe(struct platform_device *pdev)
    {
        struct resource *mem_res;
        void __iomem *base_addr;
    
        // 获取内存资源
        mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        base_addr = devm_ioremap_resource(&pdev->dev, mem_res);
        // 获取中断号
        int irq_num = platform_get_irq(pdev, 0);
        // 获取设备树中的自定义属性
        int my_value;
        of_property_read_u32(pdev->dev.of_node, "my-custom-property", &my_value);
        // ... 后续操作
    }
    
  2. 内核子系统:对于GPIO、I2C、SPI等标准外设,内核提供了完善的子系统(如pinctrl、gpio、i2c-core、spi-core)。你的工作往往不是从零写一个GPIO驱动,而是利用这些子系统提供的API,去实现具体的设备驱动。例如,为一个I2C接口的传感器写驱动,你主要实现的是struct i2c_driver,并填充其probe、read等方法,底层的I2C总线通信由内核的I2C子系统帮你完成。

这种转变要求你将硬件知识从“寄存器级”提升到“接口协议级”和“框架适配级”。

3. 实战路径:一个循序渐进的驱动开发项目

理论说再多,不如动手做。下面我们规划一个从易到难的实战项目序列,你可以将其作为个人学习的里程碑。

3.1 项目一:最简单的字符设备驱动——“Hello World”与LED控制

目标:创建一个字符设备,在加载模块时打印“Hello Kernel”,并能通过命令行echo命令控制开发板上的一个LED。

核心步骤与踩坑点:

  1. 环境搭建:不再用Keil或IAR。你需要一个Linux主机(或虚拟机),安装交叉编译工具链,并获取你的开发板对应的内核源码。这是第一道门槛,确保你能成功编译出内核镜像和模块。
  2. 编写第一个模块:
    #include <linux/init.h>
    #include <linux/module.h>
    static int __init my_init(void)
    {
        printk(KERN_INFO "My Driver: Hello Kernel!\n");
        return 0;
    }
    static void __exit my_exit(void)
    {
        printk(KERN_INFO "My Driver: Goodbye Kernel.\n");
    }
    module_init(my_init);
    module_exit(my_exit);
    
    用make编译成.ko文件,通过insmod加载,rmmod卸载,用dmesg查看打印信息。恭喜,你已进入内核世界!
  3. 实现字符设备框架:
    • 使用alloc_chrdev_region或register_chrdev动态申请设备号。
    • 定义并初始化一个struct file_operations,先实现简单的open和release。
    • 使用cdev_init和cdev_add将fops与设备号关联。
    • 在/dev下使用mknod创建设备节点,或学习使用udev/mdev自动创建设备节点。
  4. 添加硬件操作:在fops中实现write函数。当用户空间写入数据时,解析数据(例如,写入1开灯,0关灯),然后调用GPIO子系统的函数(如gpio_set_value)来控制实际的LED引脚。这里的关键是,GPIO引脚号最好从设备树中获取,而不是写死在代码里。
  5. 测试:编写一个简单的用户空间测试程序,或用shell命令:echo 1 > /dev/myled。看到LED响应的那一刻,你会获得巨大的成就感。

常见坑:忘记在exit函数中释放资源(设备号、cdev等)会导致下次加载失败;printk的打印级别不对可能看不到信息;设备节点权限不对导致用户程序无法访问。

3.2 项目二:带中断的按键驱动与并发控制

目标:实现一个按键驱动,当按键按下时,驱动能捕获中断,并将按键事件上报给用户空间。同时,要安全地处理多个进程同时读取按键事件的情况。

核心技术点:

  1. 中断注册:在驱动的probe函数中,使用request_irq申请中断。特别注意中断标志,如IRQF_TRIGGER_RISING(上升沿触发)。中断处理函数(顶半部)要尽可能短,通常只是读取状态、标记事件,然后调度底半部。
  2. 底半部处理:使用tasklet或workqueue。例如,在中断顶半部中tasklet_schedule,在底半部函数中进行实际的事件处理和数据准备。
  3. 并发与同步:
    • 当多个用户进程调用read等待按键事件时,你的驱动需要让它们等待。这里引入等待队列(wait queue)。在read函数中,如果当前没有按键事件,则调用wait_event_interruptible让进程休眠。
    • 在中断底半部中,当准备好数据后,调用wake_up_interruptible唤醒等待队列上的进程。
    • 保护共享数据(如按键事件缓冲区),需要使用自旋锁(spinlock_t) 或互斥锁(mutex)。注意:在可能休眠的上下文(如read函数中)不能使用自旋锁。
  4. 用户接口:除了read,通常还会实现ioctl来让用户空间设置去抖时间、查询中断状态等。也可以利用sysfs或procfs暴露一些调试信息。

这个项目会让你真正理解Linux驱动是如何处理异步事件,以及内核并发编程的基本法则。

3.3 项目三:集成到标准子系统——Platform驱动与设备树

目标:将前两个项目的驱动,改造为符合Linux设备模型的标准platform driver,并使用设备树来描述硬件资源。

改造要点:

  1. 定义设备树节点:在你的开发板对应的.dts文件中,添加一个节点来描述你的“虚拟设备”。
    my_platform_device {
        compatible = "my-vendor,my-device";
        reg = <0x12345000 0x1000>; // 假设的寄存器地址和大小
        interrupt-parent = <&gic>;
        interrupts = <0 100 IRQ_TYPE_LEVEL_HIGH>; // 假设的中断号
        led-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>; // LED引脚
        key-gpios = <&gpio 6 GPIO_ACTIVE_LOW>;  // 按键引脚
        my-custom-property = <42>;
    };
    
  2. 编写Platform Driver:
    • 创建一个struct platform_driver,并填充其.probe、.remove、.driver成员。
    • 在.driver中,.of_match_table是关键,它指向一个of_device_id表,其中的.compatible字符串必须与设备树节点中的compatible属性匹配。这是驱动与设备绑定的纽带。
    • 将之前字符设备驱动的初始化代码(申请设备号、注册cdev等)移到.probe函数中。硬件资源(寄存器地址、中断号、GPIO号)不再写死,而是通过platform_get_resource、platform_get_irq、gpiod_get等API从platform_device(内核根据设备树自动生成)中获取。
  3. 模块化与分离:经过这样的改造,你的驱动代码变得非常清晰和通用。.probe函数是核心的初始化入口,所有硬件相关的依赖都来自设备树。同一份驱动,只要设备树节点描述正确,就可以轻松移植到不同的硬件平台上。

完成这个项目,意味着你已经掌握了现代Linux嵌入式驱动开发的主流模式,你的技能已经与工业界的实践接轨。

4. 持续精进:从会写到写好,从驱动到内核

当你能够独立完成上述三个项目后,你已经是一名合格的Linux驱动开发者了。但要想成为专家,路还很长。

  • 代码质量:学习内核的编码风格(Linux kernel coding style),使用checkpatch.pl脚本检查自己的代码。理解并运用内核常用的设计模式,如模板方法(通过函数指针回调)、观察者模式(通知链 notifier chain)等。
  • 调试能力:printk是好朋友,但要学会动态调整日志级别(/proc/sys/kernel/printk)。掌握ftrace、perf等性能分析工具,学习使用kgdb进行内核源码级调试。能分析内核Oops信息,定位崩溃点。
  • 阅读源码:这是提升内功的不二法门。不要畏惧,从简单的驱动开始读起,比如一个基于GPIO的LED驱动,然后读一些子系统核心代码,如drivers/gpio/gpiolib.c。带着问题去读,比如“gpio_set_value这个函数调用链最终是怎么操作到寄存器的?”
  • 参与社区:订阅Linux内核邮件列表(LKML),关注你感兴趣的子系统和驱动维护者的讨论。尝试为开源驱动修复bug或添加小功能,并提交补丁。这个过程极具挑战,但收获无与伦比。

从单片机到Linux驱动,这条路是辛苦的,但风景也截然不同。它让你从面对一块芯片,变为理解一个庞大的、自洽的、由全球最聪明的大脑共同维护的操作系统生态。每一次对内核机制的理解加深,每一次成功让驱动稳定工作,都是对“工程师”这个词的一次重新定义。这份指南为你划出了路径和重点,但真正的成长,藏在每一行你亲手编写、调试、最终跑通的内核代码里。拿起你的开发板,从第一个printk开始吧。

嵌入式软件工程师成长指南:从C语言到Linux驱动的实战路径 嵌入式系统开发是连接软件逻辑与物理硬件的核心技术领域,其核心在于通过编程实现对底层硬件的精准控制。从原理上讲,开发者需要理解处理器架构、内存映射、外设寄存器操作以及中断机制,这些构成了嵌入式软件的基础。掌握这些技术不仅能实现高效的资源管理,更能为物联网、智能设备等复杂应用场景提供可靠的技术支撑。在实际工程中,C语言因其接近硬件的特性成为嵌入式开发的主流语言,而实时操作系统(如FreeRTOS)的引入则解决了多任务调度与资源竞争的难题。随着系统复杂度的提升,嵌入式Linux及其驱动框架为构建功能丰富的产品(如 阅读详情

相关推荐

嵌入式工程师成长指南:从单片机到Linux驱动的全栈技能树构建

嵌入式系统开发是连接硬件与软件的关键技术领域,其核心在于对计算机体系结构的深入理解和对实时性、可靠性的极致追求。从基础的微控制器(MCU)编程,到实时操作系统(RTOS)的任务调度与资源管理,再到复杂的Linux系统下的应用与驱动开发,技术栈的演进体现了嵌入式系统从简单控制到智能互联的发展脉络。掌握这些技术,使开发者能够为物联网设备、工业控制和消费电子等领域构建稳定高效的底层系统。本文以一位资深工程师的成长路径为线索,系统梳理了从硬件设计、单片机开发到Linux内核与驱动、音视频处理及物联网应用的全栈技能体

weixin_42628573的博客 588

Elasticsearch——索引配置、模板和重建详解

使用keyword分词器、lowercase分词过滤、字符过滤器是html strip,这3部分构成一个分词器。上面示例返回分词结果是this is a test,其中html_strip过滤掉了html字符。也可以指定索引进行分词。

吴声子夜歌的博客 3052

嵌入式工程师技术成长与避坑指南(20年一线开发调试经验分享~~!)

作为一名在嵌入式领域深耕20余年的工程师,我的技术成长轨迹可以用"螺旋上升"来形容。

zhlhappy的博客 936

使用es必须要知道的一些知识点:索引篇

如果你的批量太大,它们会占用过多的内存。分区规则不一致:不同的索引模板可能具有不同的分区规则,例如按时间分区、按地理位置分区等。当批量处理器处理多个索引模板的请求时,如果分区规则不一致,会导致数据在不同的分区之间不均匀分布,影响查询性能和数据的存储效率。当Elasticsearch被用作大数据量存储中心时,尤其是从Mysql迁移数据进来的情况下,我们很多场景下其实无需对字符串分词,也就是说字符串存储不使用es中的。管理复杂性:处理多个索引模板的请求会增加管理的复杂性,包括索引模板的创建、更新和删除等操作。

子涵先生 6557

小白找工作:嵌入式工程师(从单片机到嵌入式,我该投哪个岗位)

小白找工作:嵌入式工程师前言从单片机到嵌入式,我该投哪个岗位 前言 好久没有写博客了,这段时间主要是去做自己的毕业设计了,嵌入式学习也就先放了一段时间 最近在找嵌入式实习的岗位,遇到了点事情,跟大家分享一下,避免走弯路 从单片机到嵌入式,我该投哪个岗位 小白一开始也很迷茫,先后投过硬件岗和软件岗;说说这些岗位的要求吧。 硬件工程师 ,主要考察你的硬件设计能力,比如手画一个升压电路的原理图啦,AD软件的操作啦,高频信号的采样啦……对软件编写要求不高,甚至没有要求。看重你的数电模电的基础知识,以后的工作也差不

qq_38406667的博客 1705

ESP32+HC-SR04超声波测距:5分钟搞定智能避障小车核心功能(附完整代码)

本文详细介绍了如何使用ESP32开发板和HC-SR04超声波测距模块快速构建智能避障小车的核心功能。通过优化的接线方案、核心代码实现及调试技巧,帮助开发者5分钟内完成硬件连接与软件编程,实现高效的避障功能。附完整代码,适合创客教育和机器人开发。

weixin_29185199的博客 386

ES-index索引配置

Index Options   index索引配置项使用。 index_options   Index 有4中配置,可以控制倒排索引的内容。   Text类型默认记录positions,其他默认docs。记录的内容越多,所占用的空间越大。   Index 有4中配置如下: docs   记录doc id。 freqs   记录doc id 和term frequencies。 positions   记录doc id / term frequencies / term positions。 offsets

ALONG的博客 3003

MT4-EA自动化交易研究笔记(2022-04-22)

自从接触到mt4的EA自动化交易,更让我这个10多年的老程序员看到了曙光,目前来看也确实出了一点成果,只是是否能稳定盈利有待时间的考验,所以开此专栏,一来做做记录与分析,更好的优化我的EA,二来也希望能与更多的高手交流,以完善我的交易系统

t35254056的博客 2291

从单片机步入Linux驱动开发(概念和Demo)

单片机的裸跑能实现很多功能,代码量也不大,但是在嵌入式领域不学习Linux,那写再多的代码也枉然,因为有无数的大牛给Linux添砖加瓦,并且Linux有开放源码,易于移植,资源丰富,免费等优点。 首先我们看一个Linux系统的内容:可以分为应用程序、库、操作系统、驱动程序。一共五个层次,如下图: 应用程序层是直接使用open read write ioctl这些库函数。Linux驱动开始是要根据项目需求编写具体的驱动程序,也就是open read write ioctl这些函数的具体内容。不同的外设有不同

qq_41960161的博客 2152

vuecil3+版本下,兼容ie等不支持es6的低版本浏览器

*综上,完成兼容性涉及到的配置的文件有,对应在页面中查看代码,就不单独附代码了:main.js。

yhr0322的博客 835

LMX2594时钟配置实战:TICS PRO从入门到寄存器导出

本文详细介绍了LMX2594时钟芯片的配置实战,重点讲解了如何使用TICS PRO调试软件简化复杂的寄存器设置过程。通过实例演示从基础频率配置到高级参数调优的全流程,并分享SPI写入的嵌入式系统移植技巧,帮助工程师快速掌握高性能时钟芯片的配置方法。

weixin_29189003的博客 555

【Elasticsearch】Elasticsearch索引创建与管理详解

Elasticsearch 是一个基于 Apache Lucene 的开源搜索引擎,具有分布式、近实时、RESTful API 等特点。索引是 Elasticsearch 的核心概念之一,索引的创建和管理是使用 Elasticsearch 的基础技能。本文将详细介绍 Elasticsearch 索引的创建与管理,包括索引的基础概念、创建索引、索引模板、映射和索引别名等内容。

屿小夏.的知识博客 7万+

基于FPGA低频方波测量-频率与占空比

基于FPGA低频方波测量-频率与占空比

DRAXY的博客 6733

嵌入式老师傅告诉你单片机6年想转嵌入式Linux值不值得

嵌入式老师傅告诉你单片机6年想转嵌入式Linux值不值得一、你真的决定要转嵌入式Linux吗?要不要从单片机转嵌入式Linux是一个影响到职业开展的严肃决策,我不能帮你拿主见,只能帮你列出利弊,你须要依据自身的各种环境(假如所在城市Linux嵌入式相关岗位多吗?是否决定背井离乡去北上深开展等等)做出最有利的决策。我的观点并不是Linux嵌入式绝比照单片机开发职业开展好,只是依据自身的一些经历,给出一些看法。1.单片机开发相对于Linux嵌入式最大的劣势在于基层的打工岗位平均薪资偏低我想这是大局部单片机工程师

专注单片机实战教学,分享单片机学习资料 1万+

CS5511芯片实战:如何用DP转LVDS驱动高刷显示器(附配置代码)

本文详细解析了CS5511芯片在DP转LVDS高刷显示器驱动方案中的应用,包括核心架构、寄存器配置、时序优化及典型问题排查。通过实战案例和配置代码,帮助开发者快速实现120Hz高刷新率显示,特别适合医疗影像和工业HMI等严苛场景。

m3n5b7v8c9x的博客 1077

从镜头到像素:深入解析Camera、Sensor与V4L2的协同工作流

本文深入解析了摄像头从物理成像到软件控制的完整工作流。详细介绍了镜头、传感器(Sensor)与V4L2框架的协同机制,涵盖光电转换、同步信号、ISP图像处理等核心环节,并通过实战演示了如何使用v4l2-ctl工具进行调试,为嵌入式开发和驱动调试提供系统指南。

weixin_29230805的博客 389

电子工程师学习成长之路

背景故事 这段时间趁国庆假期,回家接了个婚,所以没时间更新文章了,也没带电脑,就给大家分享一下电子工程师的学习成长之路吧,希望能让大家受益。 学习建议 对于电子工程师学习成长有以下几个建议: 1 兴趣是最好的老师 2 要肯下功夫,能静得下来,回想之前做电赛,暑假两个月啃了厚厚一本单片机原理,比赛期间几天几夜,废寝忘食做赛题的日子,都是热血满满。 学习路径 关于学习路线,我总结了两种: 1.至下而上 1.1 先学习数电,模电,微机原理,再结合一些趣味电子套件(比如心形跑马灯,时钟,摇摇棒,光立方等),买回来折

玩转智能机器人 7566

Multica 自托管部署与使用入门:从上线到让 AI Agent 真正干活

Multica是一个将AI Agent作为团队成员的任务协作平台,支持自托管部署。本文介绍了完整的单机部署流程: 核心架构包括前端界面、后端服务、PostgreSQL数据库和Runtime执行机器 推荐使用Docker Compose部署,需配置数据持久化目录 提供详细的docker-compose.yml和.env配置文件说明 重点注意事项:数据库密码和JWT密钥必须修改,生产环境配置必须设为production 需正确配置前端访问地址和WebSocket连接 部署完成后,用户可创建AI Agent并将其

q742971636的博客 1732

是否要从单片机转为嵌入式Linux?

作者:嵌入式老鸟火哥 授权转载于公众号嵌入式老鸟的职场之道(ID: ict_embedded),有增加内容和修改。 最近很多童鞋投票并咨询如何从单片机转为嵌入式Linux开发。看来读者圈中做单片机,RTOS的不少。尽管火哥目前从事Linux/Android方面的嵌入式开发工作,但是读书的时候也有5年左右单片机裸机和RTOS经验,之前面试也拿过一些做单片机stm32开发的offer, 所以今天分...

韦东山嵌入式专栏 3802

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

有关嵌入式、单片机、51单片机、STM32、的一些概念详解

文章目录一、什么是单片机二、什么是嵌入式嵌入式的硬件层嵌入式的软件层嵌入式的中间层三、嵌入式和单片机的区别和联系一、什么是嵌入式二、什么是单片机三、嵌入式和单片机的区别四、51单片机和STM32单片机五、有无操作系统的区别,程序启动流程单片机有无操作系统有什么区别嵌入式/单片机有哪些操作系统关于单片机程序运行的一些理解带操作系统的嵌入式系统的启动过程六、嵌入式学习路线,单片机学习路线?到底该怎么学嵌入式方向嵌入式硬件方向嵌入式软件方向学习嵌入式需要那些内容?C语言基本的硬件原理数据结构与算法计算机基础学习路

qq_41854911的博客 3万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux嵌入式工程师养成手册-----前言

为什么会有这些博客 自己现在已经要进入大三下学期,很快就会面临秋招,自己从进入大学开始就从事嵌入式相关的开发,从arduino到STM32再到ARM+Linux开发,自己接触了不少的东西,写这些博客一个是为了对自己以往的知识进行一个总结,再一个也是希望可以给入门嵌入式的各位同学们提供一些帮助,都是从无到有,从看别人的到写自己的也是一个分享的过程。 可能大家觉得总结并不是特别的重要,但是我想说把知识...

a568713197的博客 4249

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何学习嵌入式Linux_韦东山

我在100ASK_IMX6ULL售后群里,发现很多初学者只有单片机基础,甚至没有单片机基础。在学习Linux时,对很多概念比较陌生,导致不知道学什么,也不知道学了之后有什么用。所以我趁着五一假期,编写此文。 从事嵌入式Linux培训12年来,我们写过很多《关于如何学习linux》的文章,这是最新的,本文将不断更新。 第1章 单片机和Linux的区别 1.1 有哪些产品使用单片机或Linux 所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于

韦东山嵌入式专栏 2万+

是否要从单片机转嵌入式Linux?

最近很多童鞋投票并咨询如何从单片机转做嵌入式Linux开发。看来读者圈中做单片机,RTOS的不少。尽管火哥目前从事Linux/Android方面的嵌入式开发工作,但是读书的时候也有5年左...

张巧龙的博客 2477

通俗易懂,嵌入式Linux驱动基础

前言上一篇分享的:《从单片机工程师的角度看嵌入式Linux》中有简单提到Linux的三大类驱动:我们学习编程的时候都会从hello程序开始。同样的,学习Linux驱动我们也从最简单的he...

嵌入式Linux 4081

嵌入式软件开发工程师面试指南_总结

struct ages { int age1; int age2; int age3; }; struct ages age; 分析总结:在这个示例中,数组比结构体好。但是不能得出结论数组比结构体好,在元素类型不同时只能使用结构体而不能使用数组。 struct pople { int age; //年龄 int name[20]; //姓名 int height; //身高 }; struct ages age; ...

子羽丿_的博客 9353

嵌入式Linux | 从单片机工程师的角度看嵌入式Linux

前言 这篇文章简单我们来一起梳理嵌入式Linux的一些知识,方便于一些想跟我一样想要由单片机进阶到嵌入式Linux的朋友做一些参考学习。 嵌入式Linux学哪些东西 1、认识Linux 学单片机的朋友有些有一些Linux基础了,但也不乏有些朋友没用过Linux,甚至有些初学的读者朋友没听说过Linux,为了照顾这些朋友,这里简单地认识一下Linux: 2、认识嵌入式Linux 学习嵌入式Lin...

嵌入式大杂烩 1990
上一篇: Adam优化器的学习率衰减策略:理论与实战解析
下一篇: QNX资源管理器实战:从官方文档到自定义实现(附避坑指南)
糖果HTML
博客等级 码龄3年 76粉丝 1357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值