- 博客(230)
- 资源 (17)
- 问答 (1)
- 收藏
- 关注
原创 嵌入式软件工程师笔试面试指南目录
嵌入式软件笔试,嵌入式软件面试,程序员简历书写,Linux驱动工程师笔试,Linux驱动工程师面试,BSP工程师笔试,BSP工程师面试,应届生秋招,应届生春招,C/C++笔试题目,C/C++面试题目,C/C++程序员,BSP工程师
2021-06-09 22:37:51
6760
3
原创 【技术交流群内容分享】
榜上有名希望有一天,你也能获得心仪的offer!真心为这些同学感到开心~20210430扫码加我微信备注【交流群】,拉你进群,无备注,不通过。干货分享20210430扫码加我微信备注【交流群】,拉你进群,无备注,不通过。...
2021-05-01 17:18:04
1233
4
原创 嵌入式软件工程师笔试面试指南-ARM体系与架构
嵌入式软件笔试,嵌入式软件面试,程序员简历书写,Linux驱动工程师笔试,Linux驱动工程师面试,BSP工程师笔试,BSP工程师面试,应届生秋招,应届生春招,C/C++笔试题目,C/C++面试题目,C/C++程序员,BSP工程师
2021-04-28 15:22:06
7299
15
原创 嵌入式软件工程师笔试面试指南-C/C++
嵌入式软件笔试,嵌入式软件面试,程序员简历书写,Linux驱动工程师笔试,Linux驱动工程师面试,BSP工程师笔试,BSP工程师面试,应届生秋招,应届生春招,C/C++笔试题目,C/C++面试题目,C/C++程序员,BSP工程师
2021-04-15 17:45:09
9516
7
原创 9个提高代码运行效率的小技巧你知道几个?
我们写程序的目的就是使它在任何情况下都可以稳定工作。一个运行的很快但是结果错误的程序并没有任何用处。在程序开发和优化的过程中,我们必须考虑代码使用的方式,以及影响它的关键因素。通常,我们必须在程序的简洁性与它的运行速度之间做出权衡。今天我们就来聊一聊如何优化程序的性能。
2021-01-10 17:28:38
2604
3
原创 24张图7000字详解计算机中的高速缓存
什么是缓存 缓存又叫高速缓存,是计算机存储器中的一种,本质上和硬盘是一样的,都是用来存储数据和指令的。它们最大的区别在于读取速度的不同。程序一般是放在内存中的,当CPU执行程序的时候,执行完一条指令需要从内存中读取下一条指令,读取内存中的指令要花费100000个时钟周期(缓存读取速度为200个时钟周期,相差500倍),如果每次都从内存中取指令,CPU运行时将花费大量的时间在读取指令上。这显然是一种资源浪费。 如何解决这个问题呢?有人肯定会问,直接把程序存储在缓存中不行吗? 答案是可以的。但是
2020-12-30 22:32:52
3399
14
原创 多图详解缓冲区溢出问题
蠕虫病毒是一种常见的利用Unix系统中的缺点来进行攻击的病毒。缓冲区溢出一个常见的后果是:黑客利用函数调用过程中程序的返回地址,将存放这块地址的指针精准指向计算机中存放攻击代码的位置,造成程序异常中止。为了防止发生严重的后果,计算机会采用栈随机化,利用金丝雀值检查破坏栈,限制代码可执行区域等方法来尽量避免被攻击。虽然,现代计算机已经可以“智能”查错了,但是我们还是要养成良好的编程习惯,尽量避免写出有漏洞的代码,以节省宝贵的时间!
2020-11-18 23:43:21
14510
27
原创 Linux内核中container_of宏的详细解释
上一节[拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)](https://blog.csdn.net/qq_16933601/article/details/108542631)我们在分析Linux内核链表的时候注意到内核在求解结构体偏移的时候巧妙的使用了container_of宏定义,今天我们来详细剖析下内核到底是如何求解结构体成员变量的地址的。
2020-09-24 00:27:54
4046
14
原创 拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head。本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使用的函数都给出了详细的测试用例,并且移植了Linux内核的链表结构,使得在任意平台都可以方便的调用内核已经写好的函数。建议收藏,以备不时之需!
2020-09-16 00:41:31
2836
27
原创 超详细分析Bootloader(Uboot)到内核的启动流程(万字长文!)
文章目录Bootloader启动流程分析Bootloader第一阶段的功能硬件设备初始化为加载 Bootloader的第二阶段代码准备RAM空间(初始化nandflash)复制 Bootloader的第二阶段代码到SDRAM空间中(重定位)设置好栈跳转到第二阶段代码的C入口点Bootloader第二阶段的功能。初始化本阶段要使用到的硬件设备检测系统内存映射( memory map)将内核映象和根文件系统映象从 Flash上读到SDRAM空间中为内核设置启动参数调用内核uboot启动内核详解uboot与Lin
2020-05-20 22:13:02
27377
47
原创 应届生入职半年被裁员了,我该怎么办?
首先我描述一下我情况,我今年7月进去一家公司嵌入式开发岗位,试用期前三个月我的导师安排给我一些学习任务,相关的公司项目无。三月到了,我也完成了导师给我布置的试用期任务(都是学习知识的任务,加上一些代码考核),基本上都是提前完成,我也去向导师寻求任务,但是导师并没给我,叫我继续学习。我的导师明确跟我说如果我留在原来的部门,现在到年底不会有项目给我做,也不会有文档性工作给我做,因为人员饱和,我当时没有立刻给出答复。最近,一位入职半年的读者咨询我,入职快半年了,组里要把他调到测试岗位,咨询我该怎么办?
2022-11-26 23:01:40
655
原创 uboot引导应用程序
裸机程序未加链接地址时,只能使用text代码段,如果裸机程序中使用出现了跨端操作(使用text端段以外的段:rodata,data,bss段),必须在链接时手工指定连接链接地址为实际的运行地址。在uboot examples/standalone 目录下,有hello_world.c文件,编译uboot的时候,会自动编译hello_world.bin文件。uboot默认是支持执行应用程序的,就像引导内核一样,我们也可以自己写一个应用程序,让uboot启动时引导。执行go指令去引导我们的程序。
2022-11-26 22:52:59
394
转载 valgrind基本功能介绍、基础使用方法说明
Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。
2022-11-13 17:45:48
469
原创 一位小镇做题家的付费咨询
2024年毕业,2023年9月开始秋招,你有近一年的时间准备,足够了。至于你说的实习,科研经历,这些都不是决定最后录取你的关键因素。如果你基础扎实,能胜任工作岗位,你说的这些都不太重要。这可能也是大多数在校大学生的状态,忙忙碌碌,浑浑噩噩,不知道该怎么办。缺点是人际关系比较难处理,在事业单位,想要往上升,要特别会处理人际关系。物理不是你喜欢的专业,但是你还能坚持下来,并且还能有不错的结果,那你的个人能力一定没问题!如果想要转ic,建议你去招聘网站看下,对应岗位要求的技能是什么,查漏补缺,坚持学习下去。
2022-10-31 22:19:56
849
1
原创 如何解读Linux Kernel OOPS信息
在linux内核里面有很多脚本工具,位于linux/scripts/,里面有一个decodecode工具可以用来转换机器码,decodecode脚本可以在没有源代码或符号表的情况下,将oops异常的log作为输入就可以解析出错误位置的汇编代码。LR:子程序的返回地址:从子程序返回后,主程序继续执行的指令的地址称为子程序的返回地址.LR也叫链接寄存器,用于存放子程序的返回地址。PC:PC也叫计数寄存器,用于存放下一条要执行的指令的地址,因此在子程序返回后,要将LR中的地址存入PC,即mov PC LR。
2022-10-31 22:14:36
620
原创 【RK3399】2.制作ubuntu20.04 roomfs
firefly自带的文件系统,由于缺少一些基本功能模块,因此,我们可以自己手动制作一个ubuntu20.04的文件系统。
2022-10-31 22:13:25
488
原创 【RK3399】1.RK3399开发板基础配置
最近在小黄鱼入手了一个RK3399的开发板,RK的芯片我也是第一次使用。FireFly配套提供了完善的教程,可以在他们的WIKI上找到。上面有的内容就不在本文叙述了,大家可以参考教程https://wiki.t-firefly.com/zh_CN/Firefly-RK3399/linux_compile_gpt.html这篇文章主要如何对板子做一些基础的配置。
2022-10-31 22:12:25
724
原创 一道C语言改错题
下午,在上班,读者发来一道题目,问我怎么做。不过,上网查了下,这种用法有时候也可以输出正确的结果,但不建议大家这么用。的效果是一样的,但平常为什么不见printf§这种看起来很简洁的形式呢?支持可变参数,所以后续变量的个数就需要通过str中的格式化串来确定。就会去栈中找这个格式化串对应的变量,但实际上,根本没有向。压入更多的参数,因此就会出现打印失败或者程序崩溃的现象。过了一会,他说查不到,问了群里,大家也不太会。好吧,起码这位读者自己思考过,也问过了。题目如下,找出代码中错误的地方,并改正。
2022-10-31 22:10:06
572
原创 机械转行嵌入式成功上岸!
我秋招准备不是很充分,但是也收获了比较满意的offer,整个秋招下来我认为最重要的几点如下:1.简历要打磨好,突出自己的优势,我的竞赛比较多,然后我就单独做了个荣誉奖项的模块,项目经历是面试流程中最重要的一环,项目最好要有两个,其中一个必须很熟悉,大概就是项目背景,研发流程,技术的学习方法,有没有团队工作,对项目中的技术要十分了解,一般面试官通过你的简历可能不能透彻掌握你的项目内容,你要有一套完整的说辞将你的这个项目完全表述出来,前期可能借助讲稿,面多了就记住了。
2022-09-21 22:17:14
1677
原创 secure boot(三)secure boot的签名和验签方案
FIT 格式支持存储镜像的hash值,并且在加载镜像时会校验hash值。这可以保护镜像免受破坏,但是,它并不能保护镜像不被替换。而如果对hash值使用私钥签名,在加载镜像时使用公钥验签则可以保护镜像不被替换。因此,公钥必须保存在一个绝对安全的地方。接下来的内容要求大家了解一些密码学的内容,之前也介绍过一些,可以看这篇文章secure boot (一)FIT Imagesecure boot (二)基本概念和框架计算镜像的hash值利用私钥对hash值签名签名结果存在FIT Image 中。
2022-09-21 22:15:26
1238
原创 secure boot (二)基本概念和框架
secure boot是指确保在一个平台上运行的程序的完整性的过程或机制。secure boot会在固件和应用程序之间建立一种信任关系。在启用secure boot功能后,未经签名的固件或程序将不能运行在该设备上。通过这种方式,可以保护操作系统免受恶意攻击。secure boot一般使用公钥/私钥来验证固件和应用程序的签名是否合法。消息摘要又称为数字摘要。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。
2022-09-21 22:14:13
3240
原创 secure boot (一)fit image
secure boot 和FIT Image是前段时间接触到的,其实早就该总结下了,奈何懒癌犯了,拖了好久才写出来。之前也有人问我,工作后最大的感受是什么?我的回答是:“快速学习”。就嵌入式来讲,大多数应届生在校期间可能都没做过完整的项目,仅凭在校期间学习的内容很难胜任公司的要求。就底层驱动来讲,虽然我之前也学习过韦东山老师的上s3c2440的课程,但是到了公司才发现,这些内容其实都已经过时了。但并不是说这些内容都没有必要去学习了。在学习的过程中,认为最重要的是培养我们的自学能力。
2022-09-21 22:13:08
860
原创 深入理解Aarch64内存管理
内存管理描述了如何控制操作性系统对内存的访问。每次操作系统或应用程序访问内存时,硬件都会进行内存管理。内存管理是一种给应用程序动态分配内存区域的方法。处理器是用来运行复杂系统的,比如Linux 支持虚拟内存系统。软件在操作系统上运行只能看到虚拟地址,而处理器负责把虚拟地址转换为物理地址。这些物理地址最终都会被内存系统转换为实际的物理位置。下面对本文内容做个简单总结,以下这些问题是我们要明白的。地址翻译中,statge和level有什么区别?statge 指的是把输入地址转换为输出地址的过程。......
2022-08-08 18:00:00
693
原创 intptr_t 和 uintptr_t类型使用总结
这两个数据类型是ISO C99定义的,具体代码在linux平台的头文件中。# endif==# endif64# endif为什么会根据不同的位数定义不同的长度呢?先看下不同的数据类型在不同字长机器上长度大小。位数charshortintlong指针161个字节8位2个字节16位2个字节16位4个字节32位2个字节16位321个字节8位2个字节16位4个字节32位4个字节32位4个字节32位64。...
2022-08-08 18:00:00
1342
原创 关于 uintptr_t和intptr_t 类型
最近在看代码时,发现了两个之前没见过的数据类型:,。这两个数据类型是ISO C99定义的,具体代码在linux平台的头文件中。为什么会根据不同的位数定义不同的长度呢?先看下不同的数据类型在不同字长机器上长度大小。指针在32位平台和64位平台下均与 类型的长度一致,然而在16位机器上,为4个字节,而指针为2个字节。因此,就可以发现和定义的巧妙之处:在64位机器上,为,为。而在非64位机器上,为int,为。这样就可以保证和的长度与机器的指针长度一致,因此在进行整数与 指针的相互转换时可以用进行过渡。下面写两个
2022-07-03 22:50:51
934
1
转载 ARMv8架构u-boot启动流程详细分析(一)
注:本文基于armv8架构来对u-boot进行启动流程分析,u-boot版本为2022-01。首先引用wiki上的简介:u-boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构。u-boot最先是由德国DENX软件中心团队开发,后续众多有志于开放源码bootloader移植工作的嵌入式开发人员将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持了更多的嵌入式操作系统的装载与引导。选择u-boot的理由:开放源码;支持多种嵌入式操作系统内核的引导,如Linux、NetB
2022-07-03 17:35:39
1311
原创 如何在编码阶段减少代码中的bug?
前言作为一名合格的程序员,不写bug是不可能的。如何花费最少的时间来修复bug呢?在编码阶段借助一些静态分析工具往往可以事半功倍,减少代码中的bug。静态分析工具能够在代码未运行的情况下分析源代码,发现代码中的bug。在C/C++程序中,静态分析工具可以发现程序错误,如空指针取消引用、内存泄漏、被零除、整数溢出、越界访问、初始化前使用等。编译器中的静态分析编译器的目标是生成可执行文件,所以,他们并不关注静态代码分析。但是,随着编译器的慢慢完善,在静态分析方面也做得越来越好。比如,当我们编译代码
2022-04-25 22:28:45
1077
原创 利用QEMU+GDB搭建Linux内核调试环境
前言对用户态进程,利用gdb调试代码是很方便的手段。而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试。其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qemu就是一种。qemu是一款完全软件模拟(Binary translation)的虚拟化软件,在虚拟化的实现中性能相对较差。但利用它在测试环境中gdb调试Linux内核代码,是熟悉Linux内核代码的一个好方法。本文实验环境:ubuntu 20.04busybox-1.32.1Linux kerne
2022-04-25 22:15:14
1146
原创 windows不安装虚拟机如何使用Linux系统作为开发工具?
哈喽,大家好,我是仲一。作为嵌入式开发程序员,常常需要在Linux环境下编译一些代码。安装虚拟机比较方便,但是,太占用内存了。性能不好的电脑开了一台虚拟机后,可能就干不了其他事情了。安装双系统也比较麻烦,常常需要重启电脑来完成系统的切换。今天给大家介绍一款windows上的Linux工具,既不需要虚拟机也不需要双系统,就能在windows上轻松使用Linux。WSL简介Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可.
2022-04-09 08:07:22
3201
2
原创 程序员必备14款生产力工具~
文章目录SourceInsightBeyond CompareMobaXtermTyporaPicGoutoolsQTTabBarInternet Download ManagerMindMasterdraw.ioSnipasteDittoWegesturesScreenToGif总结优秀程序员之所以优秀的原因并不一定是他写代码的速度比所有人都快,但他解决事情的效率一定是比很多人都要高的,提升工作效率的方法并不需要我们十八般武艺样样精通,有时候使用好的工具就能帮助我们大大提升办事效率。今天给大家分享1
2022-04-09 07:43:01
4786
1
原创 i2c调试工具分享
i2c-tools简介在嵌入式开发仲,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools。i2c-tools工具是一个专门调试i2c的,开源,可获取挂载的设备及设备地址,还可以读写I2C设备寄存器。下面我们就对这个工具的安装和使用做个简单介绍。i2c-tools安装下载地址:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/。本文使用的是
2022-03-27 11:18:58
3473
原创 【图文】函数调用过程中栈的变化
大家都知道函数调用是通过栈来实现的,而且知道在栈中存放着该函数的局部变量。但是对于栈的实现细节可能不一定清楚。本文将介绍一下在Linux平台下函数栈是如何实现的。栈帧的结构函数在调用的时候都是在栈空间上开辟一段空间以供函数使用,所以,我们先来了解一下通用栈帧的结构。如图所示,栈是由高地址向地地址的方向生长的,而且栈有其栈顶和栈底,入栈出栈的地方就叫做栈顶。在x86系统的CPU中,rsp是栈指针寄存器,这个寄存器中存储着栈顶的地址。 rbp中存储着栈底的地址。 函数栈空间主要是由这两个寄存器来确定的
2021-12-30 07:56:02
1137
转载 Linux 内核学习经验总结
开篇学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。内核学习,一偏之见;疏漏难免,恳请指正。为什么写这篇博客刚开始学内核的时候,不要执着于一个方面,不要专注于一个子系统就一头扎到实际的代码行中去,因为这样的话,牵涉的面会很广,会碰到很多困难,容易产生挫败感,一个函数体中(假设刚开始的时候正在学习某个方面的某个具体的功能函数)很可能掺杂着其他各个子系统方面设计理念(多是大量相关的数据结构或者全局变量,用于支撑
2021-11-20 21:59:54
1276
1
原创 优秀学弟的秋招经历(嵌入式软件)
哈喽,大家好,我是仲一。秋招基本接近尾声了,不知道大家找工作怎么样了。我建立了一个秋招群,每天虽然上班很忙,但是也会时不时关注群里的消息,回答下大家的问题。根据大家在秋招群里聊天的情况看,很多人都拿到了不错的offer。而且,今年嵌入式的薪资,整体比去年又高了一个档次。不过,秋招没有拿到满意的offer也不要紧。春招会有很多人毁约的,各大厂名额也不少。大家记得关注下春招的时间段:2月中旬 ~ 4月底。趁着这段时间,可以好好的查漏补缺。关于秋招春招有任何问题,欢迎大家找我学习交流。接下来,我邀请
2021-10-29 22:03:12
8135
1
原创 【干货分享】嵌入式学习路线公开!(书籍推荐+视频推荐+练手项目)
哈喽,大家好,我是仲一。最近有小伙伴在微信私信我,如何学习嵌入式。一直想写一篇学习路线的文章,由于各种原因拖到了现在。趁着国庆节在家,终于肝完了这篇文章。我个人是从STM32转到驱动开发的,在研二的时候学习了韦东山老师的驱动开发的课程,转到了驱动开发的方向。下面就如何学习嵌入式说下我个人的看法。什么是嵌入式?嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统。国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为
2021-10-24 10:30:00
2587
7
原创 嵌入式Linux必读经典书籍
最近,在知乎看到一个问题,“嵌入式Linux有哪些好书推荐”。我读研期间也喜欢收藏一些书籍,每次看到京东有活动,总是忍不住想买一些书籍回来。随着时间越来越久,我买的书越来越多,但是都看完不太现实。后来发现书不在于多,而在于经典。买了书搬家是个麻烦事,我从网上搜集了一套计算机电子书,从中筛选了我看过的好书分享给大家。在这里我推荐我看过的比较好的书,从入门到进阶。这是我上学期间买过的一些书,其中的很大一部分还没看完:我整理的这些书大家可以在这里免费白嫖,都是嵌入式领域的经典书籍,从入门到深入理解,整理
2021-10-12 21:50:33
3687
3
原创 【MIT6.S081/6.828】Lab util: Unix utilities
文章目录1. sleep1.1 实验要求1.2 代码实现1.3 测试2. pingpong2.1 实验要求2.2 分析2.3 代码实现2.4 测试3. primes3.1 实验要求3.2 代码实现3.3 测试4. find4.1 实验要求4.2 ls代码分析4.3 代码实现4.4 测试5. xargs5.1 实验要求5.2 代码实现5.3 测试哈喽,大家好,我是仲一。本篇文章是从零实现操作系统的第一个实验,主要是让我们熟悉 xv6 及其系统调用。做实验以前,建议先阅读下xv6 书籍的第一章。另外,在官网
2021-09-26 07:19:27
2250
原创 详解Linux中的fork,exec,wait
fork举例#include "kernel/types.h"#include "user/user.h"int main(){ int pid; pid = fork(); printf("fork() returned %d\n",pid); if(pid = 0){ printf("child\n"); } else{ printf("parent\n"); } exit(0);}在第12行,我们调用了fork。fork会拷贝当前进程的内存,并创建一个新的进
2021-09-03 07:00:29
1342
SC2440u-boot-2012.04.01_07yaffs.rar
2020-05-04
S3C2440_u-boot-2012.04.01_06DefaultParameter.rar
2020-05-04
S3C2440_u-boot-2012.04.01_05DM9000.rar
2020-05-04
S3C2440_u-boot-2012.04.01_03Nor_Boot.rar
2020-05-04
u-boot-2012.04.01_04Nand_Operation.rar
2020-05-04
u-boot-2012.04.01_02Nand_Boot.rar
2020-05-04
S3C2440_u-boot-2012.04.01_01New_Board.rar
2020-05-04
019_nand_flash_016.rar
2019-08-25
TortoiseSVN 安装后桌面菜单右键无显示?
2019-10-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅