登录社区云,与社区用户共同成长
邀请您加入社区
我们正处在一个技术巨浪交汇的时代:AI从云端走向现实,视觉与具身智能让机器“看见”并行动。硬件廉价、算法强大,跨界融合成为可能。视觉是认知的起点,也是智能的入口。医疗、物联网、机器人等前沿领域亟需既懂硬件又懂智能的“接线员”。不必畏惧门槛,从点亮一颗LED开始,用代码与电路搭建智能体的肉身。生逢其时,何不追寻心中的“北极星”?在代码与电路中仰望星空,亲手拼出属于这个时代的理想国。
冯诺依曼体系结构将计算机分为输入、内存、CPU、输出四部分,数据在设备间通过内存流动。程序需加载至内存才能运行,因CPU仅与内存交互。操作系统作为软硬件桥梁,管理进程、内存、文件与设备,通过系统调用提供安全接口。进程是运行中的程序,由PCB(task_struct)和代码数据组成,状态包括运行、阻塞、僵尸等。进程切换依赖寄存器上下文保存与恢复,调度算法基于优先级与时间片实现。内存用于平衡速度与成本
目前全世界有数百种编程语言,不同语言在设计目标上各有侧重:有的主打开发效率,有的侧重内存安全,有的面向特定业务领域。每年都有新语言推出,带来更现代的抽象机制、更强的工程能力。但一个很有意思的现象是:C 语言诞生五十余年,至今仍然广泛应用在操作系统内核、嵌入式设备、驱动、编译器、数据库、网络协议栈等底层场景。为什么一款诞生于 70 年代、语法精简的语言,能够穿越几十年技术迭代而没有被淘汰?C 语言的
我们都知道Linux作为应用最为广泛的操作系统之一,它源码开放可修改,开放性高,丰富的硬件生态,适配性和可移植性强等等有点。关于硬件的可移植性,离不开Linux中丰富的子系统框架,但是为啥相同的内核代码可以适配不同的硬件呢,今天我们就以i2c子系统为例来唠唠这个事儿。总之呢,这就是Linux的魅力也是难点所在,一大堆结构体嵌套,函数从这个文件跳到另一个文件,内核极其庞大,想要全部通读内核是不现实的
文件,是存储在外部存储设备(磁盘、U 盘、SSD)上、有名字的一组有序数据的集合,操作系统把它抽象成一个统一的访问对象,程序通过文件操作来读写这堆数据 也就是说文件就是一个存放着数据的对象 我们可以通过文件操作 借助操作系统 对其操作我们写的程序可以叫做程序文件 带有数据的文件可以叫做数据文件在c语言中系统给我们了一个结构体 FILE每个编译器里对这个结构体的定义大同小异 所以我们不用再自己定义了
2027年C语言的就业前景是“结构性稳定、窄而深”,不会成为大众高增长方向,但在嵌入式、系统软件、汽车电子、工业控制、通信、安全等底层领域仍是刚需。它的前景在于底层和硬科技领域,适合愿意深入系统、硬件、OS、汽车、工业、安全的人。嵌入式、驱动、内核、汽车电子、工业控制、通信协议、安全逆向等岗位,C仍是主力语言。指针、内存管理、编译链接、栈堆、二进制、操作系统接口,这些概念通过C理解最直接。很多公司
纯C开发岗数量远少于Java/前端/算法,但嵌入式、汽车电子、芯片固件、Linux底层、工业控制等方向仍需要C,且受AI芯片、智能汽车、机器人、国产替代等带动,需求不会消失,但门槛和竞争会提高。做MCU、传感器、外设驱动、RTOS应用、物联网设备。需要补:单片机、STM32、FreeRTOS、I2C/SPI/UART、电路基础。项目要能讲底层细节:不要只做点亮LED,最好有RTOS调度、驱动、通信
进程是操作系统分配资源的基本单位。为了保证安全性,操作系统为每个进程分配了独立的虚拟地址空间,一个进程无法直接读取或修改另一个进程的内存。当多个进程需要协同工作时,就必须通过操作系统提供的 IPC 机制来交换数据。无名管道,也称匿名管道,是 Unix/Linux 中最简单的 IPC 机制。它的本质是内核维护的一块环形缓冲区fd[0]:读端,用于从管道读取数据fd[1]:写端,用于向管道写入数据数据
导言:学习一门编程语言,首先应该是去了解它,理解它的运行逻辑和运用方向。本文作为为该复盘系列的前言,并不会再去赘述有关C语言的历史,而是直接从实用的语法复盘开始讲。正文:怎么在电脑上使用C语言分为三步:一、装编译器,二、使用gcc一行命令编译代码,三、main是从哪儿进去的。“装编译器”通常指装 GCC 工具链,里面不只有 gcc,还包括汇编器、链接器和 C 运行库启动文件。所以 main 里的
数组是相同数据类型元素的有序集合,在内存中占用一段连续的存储空间。如果我们需要存储100个学生的成绩,单独定义100个变量会非常麻烦,数组就是用来批量存放同类型数据的.数据类型 数组名[数组长度];// 定义可以存放5个int的数组,下标:0、1、2、3、4注意:C语言标准中,[]里面必须是常量(C99支持变长数组VLA,但工程里不推荐,兼容性差)数组是C语言的基石,后续的字符串、结构体数组、栈、
C程序启动的时候,系统会偷偷帮我们打开3个流,不需要手动fopenstdin标准输入流:键盘,scanf从这里读数据stdout标准输出流:屏幕,printf往这里打印stderr标准错误流:屏幕,打印错误信息那流是什么?我们可以把流想象成一条流淌字节的小河。程序和外部设备(键盘、屏幕、磁盘文件)交换数据,数据就在这条河里流动。操作磁盘文件,本质就是打开一条通往磁盘文件的流。每打开一个磁盘文件,操
嵌入式、Linux 内核/驱动、通信、汽车电子、工控、安全、数据库、编译器、网络协议栈等,经验价值高,40+、50+ 很常见。可能回暖:汽车电子、芯片固件、工业控制、机器人、通信设备、安全、AI 算力基础设施(驱动、固件、推理引擎底层)。新项目会更多用 C++、Rust、Go、Python,C 更多存在于存量系统、驱动、固件、协议栈、RTOS。:C++、Python 脚本、Rust、Shell、硬
在调试机器人SDK Demo时,发现GetSDKVersion()始终返回旧版本号。通过ldd排查,确认程序加载的是系统目录/lib/libfjrobot.so的旧库,而非本地编译的新版。原因在于Linux动态链接器优先加载系统路径库。解决方法:开发阶段使用LD_LIBRARY_PATH=./x86-64:$LD_LIBRARY_PATH临时优先加载本地库;或永久替换系统库(仅限开发环境),删除旧
先把技术约束摆清楚。激光SLAM。室内结构化环境很好用,但室外开阔场景特征稀疏——小区门口一片空地上,激光打出去没什么反射特征,建图质量差,定位跟着飘。纯视觉SLAM。受光照影响大,夜间和逆光场景退化明显。消费级单点GPS。精度3-5米,开阔环境下能告诉机器人"大概在哪条路上",但要开到家门口、对准某个单元门,这个精度完全不够。室外段必须上RTK,把定位精度拉到厘米级;室内和遮挡段靠IMU短时推演
线程是操作系统调度的最小单位,共享进程资源但拥有独立栈区,实现高效并发。与进程相比,线程创建开销小、并发度高,但稳定性差,一损俱损。使用POSIX线程库需包含pthread.h并链接-lpthread。核心操作包括:pthread_create创建线程,pthread_self获取ID,pthread_exit退出,pthread_join阻塞回收或pthread_detach设置分离属性自动回收
本文基于STM32F103C8T6平台,介绍μC/OS-III实时操作系统的移植与应用。通过创建多个独立任务,实现LED翻转与串口打印功能,解决裸机程序响应卡顿问题。后续将结合AHT20温湿度传感器,深入学习I2C通信原理,并完成硬件I2C驱动开发与协议分析,为嵌入式系统多任务处理奠定基础。
Linux 中线程是轻量级进程(LWP),线程必须隶属于某一个进程,不能独立存在。进程:操作系统最小的资源分配单位,拥有独立的地址空间、文件描述符等完整资源。线程:操作系统最小的执行/调度单位,是进程内部的一条执行流。一个进程内默认存在一条线程,即主线程;同一进程内的多个线程是平级关系。sem_t sem;由于锁资源申请与释放逻辑不合理,导致多个线程/进程相互等待对方持有的资源,从而都无法继续向前
嵌入式C、驱动、BSP、协议栈、芯片固件仍有招聘,但简历门槛明显提高。:深圳、上海、北京、杭州、苏州、南京、成都、武汉、西安、合肥等机会较多,尤其长三角/珠三角的嵌入式、汽车、芯片产业链。:C++、Python、Git、Makefile/CMake、GDB、逻辑分析仪/示波器、项目复盘。:MCU、RTOS、BSP、驱动、传感器、机器人、储能/新能源。:芯片固件、SDK、验证、底层驱动、AI算力/推
进程是程序的一次动态执行过程,区别于磁盘上静态的二进制文件(如a.out操作系统通过(Linux 中为结构体)对进程进行全生命周期管理。
很多初学者觉得 return 0;是一句无用的废话。· 但其实,它是你和操作系统之间的确认。当你写下 return 0,代表你告诉系统:“报告老大,我的程序正常执行完毕,没有乱搞。· 但如果你的程序执行后出现return value 3221225477(十六进制为 0xC0000005),那是系统在警告你:“你触发了非法内存访问,我把你的程序当场击毙了。
例子:AGV小车、六轴工业机械臂、普通协作机器人、SLAM机器人的位姿(x,y,z,roll,pitch,yaw) ,很多都是float。- 机器人传感器:IMU、激光雷达、里程计原始数据本身精度就有限,传感器噪声远大于float本身的浮点误差,用double属于“浪费算力”。- 内存小:4字节一个坐标点。4. 仿真软件(ROS的仿真、Webots、Gazebo、动力学仿真):仿真计算大量迭代,普
进程是程序在内存中执行的动态实体,由CPU调度并占用内存、文件、设备等资源。操作系统通过进程控制块(PCB)管理进程,记录其状态、资源使用等信息。进程具有就绪、运行、阻塞、僵尸等状态,支持并发与并行执行。创建进程依赖fork()系统调用,采用写时复制机制提高效率。进程可通过多种方式退出,若父进程未回收子进程,将产生僵尸进程,占用系统资源;若父进程先于子进程退出,则子进程成为孤儿进程,被init或s
本文提炼了ESP32家族、经典开发板特性及FreeRTOS的核心概念:1. **ESP32家族**:分为经典款(全能)、S系(AI/带屏)、C系(低功耗性价比)、H系(无WiFi/主打Matter)和P系(无网络纯算力)。2. **WROOM-32开发板**:搭载双核LX6,集成WiFi和蓝牙。其生态极丰富且稳定,是物联网入门首选,但架构偏老、功耗稍高。3. **FreeRTOS**:微控制器实时
BSY-OS是本人一个的一个mini实时操作系统,对系统资源要求极低,而且便于学习使用和移植,今天给开源出来,希望能给您带来帮助,源代码可以到Github或Gitee下载,里边有Demo。
点亮一颗 LED 不需要操作系统,三条对"地址"的赋值就够了。拆开 MMIO 的地址译码路由、volatile 不可省略的优化对抗、uintptr_t 与寄存器指针的类型位置;Cortex-M 地址是真的,Cortex-A 地址是假的。
This problem involves merging and sorting elements from two binary search trees (BSTs) into a single ascending list. The solution leverages the properties of BSTs, where an inorder traversal yields so
学习主题:《从 C 语言到 AI 编程实践》
我是Christopher Moretti,计算机科学系的讲师。这是我在普林斯顿的第11年,也是第5次教授COS 217课程。我的背景是分布式计算系统,但目前专注于计算机科学教育。本课程的目标主要分为两大方面。现在,我们开始深入本学期的第一个真正主题:我们将要使用的计算环境。如前所述,我们将在整个课程中广泛使用Linux操作系统和GNU工具。Linux是一个操作系统,开源且免费。虽然许多人认为Li
到2027年,大学仍然值得学C语言,但“学C”的目的不再是靠它找所有开发工作,而是把它当作理解计算机系统的底层基础课。AI不会让程序员整体失业,但会明显改变程序员的工作方式,并压缩低水平重复编码岗位。有必要,但要看怎么学、学到什么程度。C语言的价值主要不在“语法”,而在于它逼你理解:内存如何分配、指针是什么、栈和堆有什么区别;程序如何编译、链接、加载、运行;操作系统、驱动、嵌入式、网络协议、数据库
我们从0写的操作系统,不依赖各种开源项目,纯rust+c+汇编
操作系统的C代码并不能直接“关闭电源”,它更像是写了一个“关机”纸条,塞到硬件的通信端口里。硬件接收到这个纸条后,断开电路,才是真正的“断电”。最后那段while(1)死循环,就是为了在硬件没收到纸条时,让CPU停下来等待,防止出现意想不到的异常。
系统调用就是程序穿越到内核态找操作系统“办事”的窗口。
不要只有学生管理系统。做驱动、协议栈、RTOS移植、简易数据库、网络服务器、性能优化对比、芯片外设驱动等。C岗位数量少于Java/Go/前端,且很多在制造业、芯片、汽车、基础软件,不在互联网。通常看:学校、实习、项目、竞赛、系统基础。:指针、内存管理、结构体、宏、链接、Makefile/CMake、调试。:MCU、RTOS、车载控制器、BMS、域控制器、AUTOSAR相关。:操作系统、体系结构、汇
C语言是一种高效、接近底层的编译型、静态类型语言,由Dennis Ritchie开发,广泛应用于操作系统、嵌入式系统及众多现代语言(如C++、Go)的基础。其核心特性包括指针、动态内存管理、结构体与函数,支持基本数据类型、数组、字符串(以字符数组实现)、条件判断、循环及文件操作。虽无内置集合或异常处理机制,但可通过自定义结构、宏和错误码实现灵活编程。
C++ 标准库(以 C++20 为例)覆盖的领域主要包括:Lstd={containers, iterators, algorithms, IO, threading, filesystem, regex, format, ranges, coroutines}\mathcal{L}_{\text{std}} = \{\text{containers},\ \text{iterators},\ \
本文通过GDB调试内核,深入分析i386架构下getpid系统调用的执行过程。从用户态进入内核时,CPU切换至ring 0,寄存器被保存,栈结构由硬件压入12个寄存器,软件补全orig_eax等字段,形成pt_regs结构。通过跟踪sys_getpid入口,验证了内核栈布局、寄存器状态及系统调用号传递机制,揭示了“轻量”调用背后的复杂底层操作,展现了操作系统核心机制的真实运行现场。
最近整理之前参与过的一个四足机器人项目,团队主业是惯性姿态传感器模组的研发和量产,这个项目从九轴vs六轴选型、航向解算、打滑检测到标定产线,我们全程参与了方案讨论和样机验证。
1:操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用(systemcall)2:c库是为了通用(跨平台,linux,win ),而设计的函数接口。3:systemcall 直接可以使用linux系统提供的功能。4: c库是对systemcall 的封装。c库的函数会调用systemcall中的函数。
C只是工具,岗位真正要的是:嵌入式Linux、驱动、RTOS、汽车电子、协议栈、固件、芯片验证、存储、网络安全、高性能网络等。AI能写模板代码,但硬件联调、时序问题、内存泄漏、驱动兼容、性能优化、现场问题定位仍需要人。面试常问内存布局、中断、进程线程、TCP、Makefile、死锁、性能优化。投递关键词用:嵌入式软件、BSP、驱动、固件、汽车电子、协议开发、底层软件、测试开发。能接受深圳、上海、北
系统编程关注的是如何直接与操作系统打交道,其中「文件 I/O」是最核心的主题之一。在操作系统眼里,文件不仅是磁盘上的普通文件,还包括管道、套接字、设备、终端等,几乎一切输入输出对象都被抽象为「文件」。为什么printf和write的性能差异巨大?什么是用户态缓冲与内核态缓冲?为什么高性能 Web 服务器强调零拷贝?阻塞与非阻塞、同步与异步到底有什么区别?本文以 Linux/C 环境为主,从最底层的
对于刚刚接触编程的同学来说,学习一门编程语言的第一步往往不是编写代码,而是搭建开发环境。在学习过程中,我们可能会遇到以下问题:C、C++、Java、Python 有什么区别?为什么安装了 VS Code,却不能直接运行代码?为什么 Java 可以运行,但javac命令无法识别?C 和 C++ 是否需要分别安装编译器?一台电脑能否同时配置多种编程语言?配置环境变量究竟有什么作用?本文将围绕上述问题,
KERNEL_OBJ全称Kernel Build Output Tree(内核构建输出树),是内核编译后所有产物与构建环境的集合目录。项目中常写作KERNEL_OBJ、KERNEL_BUILD_DIR,对应编译参数O=指定的路径。
本文介绍了Linux内核中epoll机制的核心设计与实现。epoll通过红黑树和就绪链表实现高效事件管理,相比select、poll具有O(1)的事件检测复杂度。关键结构体eventpoll和epitem分别管理epoll实例和被监听的文件描述符。系统调用epoll_create创建epoll实例,通过epoll_ctl操作红黑树,其中ep_insert将回调函数注册到目标文件的等待队列。epol
本文深入剖析了Linux内核中epoll的两种触发机制(ET边缘触发与LT水平触发)的核心差异。通过分析内核源码,揭示了两种模式在事件到达和交付阶段的不同处理逻辑:ET模式仅在状态变化时触发一次,而LT模式会持续通知直至事件被处理。文章通过伪代码和数据流演进图详细对比了二者在内核数据结构维护、系统调用开销等方面的差异,并指出ET模式必须配合非阻塞I/O和循环读写操作以避免数据滞留。最终总结了两种模
本文分析了JDK 8中markwrord状态变化对CPU和Linux内核的影响。markwrord是Java对象头的核心部分,通过低几位的组合实现了五种状态的复用(无锁、偏向锁、轻量级锁、重量级锁和GC标记)。在偏向锁模式下,由于无需原子指令操作,仅涉及CPU缓存的读写,避免了总线竞争;而轻量级锁则通过CAS操作实现,会导致CPU缓存行的无效化。当锁升级为重量级锁时,会触发Linux系统调用和线程
本文深入剖析了Linux内核中epoll水平触发与边缘触发的源码实现差异。通过分析eventpoll.c源码,重点解读了ep_send_events_proc()的处理逻辑,揭示了两种模式的核心区别:LT模式下内核会将未处理完的事件节点重新放回就绪链表,保证持续通知;ET模式下节点会被移出就绪链表,只有发生新事件时才会重新激活。文章还对比了两种模式在数据流处理上的性能影响,指出ET模式需要用户态循
本文剖析了Linux内核中epoll边缘触发(ET)模式的源码实现机制。通过分析fs/eventpoll.c中的核心数据结构eventpoll和epitem,揭示了ET与水平触发(LT)的本质差异。关键发现包括:1事件生产阶段ET与LT无区别;2差异发生在事件消费阶段的ep_send_events_proc函数;3ET模式下事件被消费后会立即从就绪链表移除,而LT会保留未处理完的事件。文章详述了内
c语言
——c语言
联系我们(工作时间:8:30-22:00)
400-660-0108 kefu@csdn.net