- 博客(27)
- 资源 (1)
- 收藏
- 关注
原创 基于slimboot学习emmc
SLB中block设备接口的定义在slimboot中,针对对类似flash设备的操作定义了下面的接口 typedef struct { DEVICE_INITIALIZE DevInit; DEVICE_GET_INFO GetInfo; DEVICE_READ_BLOCKS ReadBlocks; DEVICE_WRITE_BLOCKS
2022-05-17 23:15:40
555
原创 从tinyemu项目中学到的一些c语言的奇技淫巧
最近空闲时间比较多,想着自己实现一些硬件协议的模拟器,加深对协议的理解。首先就是了解一下模拟器的实现,从大佬身上学习是最快的。我选择了Fabrice Bellard的项目tinyemu进行学习,还是有不少收获的,一方面了解硬件模拟代码的框架,一方面加深了对c语言的理解。本文主要介绍一下tinyEMU中常用的一些技巧。使用c语言实现template在tinyemu中,cpu可以是32,64甚至是128bit的。cpu位宽的差异不影响软件模拟cpu操作的主要逻辑,我们只需要在处理数据时,注意处理的cpu位宽
2022-05-08 17:07:36
458
原创 从raspberry pi OS 64-bit lite开始安装图形界面(icewm ,dwm)
安装icewm简单版本首先准备好无图形界面的操作系统raspberry pi OS 64-bit,我使用的是2022年4月4日的版本。新版本的系统删除了默认的pi用户,需要自己创建,最好使用rpi-imager可以配置。配置好串口,wifi,ssh等基础设置,使用最新的rpi-imager可以配置这些属性。安装X window的最小系统apt-get install --no-install-recommends xdm icewm icewm-themes xserver-xorg x
2022-04-10 13:47:41
2809
原创 嵌入式软件工程师的基本素养——构建工具的使用(Makefile)
作为一个嵌入式软件工程师,能够基于一个开发板构建自己的OS是一个基本的要求。一般来说OS的代码量和文件数都不算少,所以掌握构建工具将源码组织编译也是一个嵌入式软件工程师的基本要求。现在市面上的构建工具多种多样,针对嵌入式软件使用的构建工具有以下几种,老牌工具make,现在大多数项目使用的是cmake。如题目所示,本文主要介绍make的使用方式,即makefile的编写方式。下面我将举几个例子从实践和理论两个方面介绍make的用法。实践方面Stm32-freeRTOS以我自己的一个项目举例,这是一个基于
2022-04-05 16:23:26
767
原创 rust学习------[day2]使用Slice类型
Slice类型Slice是rust中另外一种不用获取value的ownership就能够操作数据的结构Slice使您可以引用集合中连续的元素序列,而不是整个集合在内存中的分配:对比reference在内存中的分配,String slice在栈上的结构多了一个len字段,用于表示当前slice指向内存区域的大小。问题1 :编写一个接受字符串并返回在该字符串中找到的第一个单词的函数。 如果函数在字符串中找不到空格,则整个字符串必须是一个单词,因此应返回整个字符串。解:一般的思路,我们将输入的字符
2021-05-30 08:45:57
290
原创 rust学习------[day2]理解References and Borrowing
【】# References and Borrowingreference允许我们在不获取变量的ownership的情况下,使用一些value(我理解就是一块内存区域)rust中引用的使用原理例子fn main() { let s1 = String::from("hello"); let len = calculate_length(&s1); println!("The length of '{}' is {}.", s1, len);}fn calcu
2021-05-30 08:42:09
152
原创 rust学习------[day2]理解ownership的特性
文章目录Ownership变量和数据的交互方式:move变量和数据的交互方式:clone栈上的数据Ownership和函数返回值和ScopeOwnership变量和数据的交互方式:move普通变量的赋值fn main() { let x = 5; let y = x;}第一句将5与变量x绑定,第二句是创建了一个x的值的副本,并将该值与变量y绑定String类型变量的赋值fn main() { let s1 = String::from("hello"); l
2021-05-30 08:39:39
130
原创 jos中boot执行过程
根据代码注释来看:开启cpu,切换到32位保护模式,跳转到c代码。BIOS会将硬盘上第一个扇区加载到内存中,同时在实模式下cs=0,ip=7c00开始执行1、16位模式开始执行,关闭中断,将DF置为0,在对串si和di都是增量加2、初始化几个重要的段寄存器3、使能A20为了与最早的PC向后兼容,物理地址线20接低电平,因此高于1MB的地址默认为零。从0x64端口读入一个字节到al寄存器中,test指令功能上类似and指令,只是它不影响控制寄存...
2021-04-21 01:29:36
256
原创 jos学习---day1代码整体结构
目录结构workdir|------ GNUmakefile||------ boot| |---- Makefrag|------ fs||------ inc||------ kern| |---- Makefrag||------ user||------ conf| |---- env.mk| ...
2021-04-21 01:11:23
308
原创 【DAY2--带你学习emacs】在编辑时的一些重要指令
序言上篇中介绍了一些基础操作的指令,在这篇文章中,主要介绍一些,我们在编辑文档时,如果更加便利的写文章。Mark许多Emacs命令在当前缓冲区的任意连续部分上运行。 要指定用于执行此命令的文本,请将标记设置在其一端,然后将指针移至另一端。 点和标记之间的文本称为区域。 无论文本中的哪一个先出现,该区域始终在点和标记之间延伸。 每次移动点时,区域都会改变。将标记设置在文本中的某个位置也会激活它。 当标记处于活动状态时,我们也说该区域处于活动状态。 Emacs通过使用区域面部突出显示其中的文本来指示其范
2020-11-29 01:19:55
258
原创 【DAY1--带你学习emacs】basic操作的使用
序言最近,重新学习SCIP这本书,升起了仔细学习LISP的想法,主要感觉LISP的抽象能力实在,想看看LISP到底能做到哪些事情。为了学习LISP,我决定先搭建一套common lisp的开发环境,毕竟是现在最流行的lisp方言。首先就是emacs,早有听说emacs号称是“神的编译器”,在这里我也不想再谈emacs和vim的优劣,不过由于对lisp的好感,让我觉得emacs的功能要更加强大,所以即使现在我对vim的了解足够我在工作学习中使用了,我还是有很大的兴趣去学习emacs。接下来这个系列我都是跟
2020-11-29 01:13:23
239
原创 搭建嵌入式开发的vim环境【3】vim键位映射和插件的使用
vim mapping机制各种map命令作用的模式命令模式mapnormal,visual and Operator-pendingvmapVisualnmapNormalomapOperator-pendingmap!Insert and Command-lineimapInsertcmapCommand-linevim中的各个模式官方文档描述在这里模式描述normal执行vim命令以及按了esc之后
2020-09-12 11:59:44
416
原创 搭建嵌入式开发的vim环境【2】vimrc的基本配置
环境准备系统:ubuntu-18.04基础配置执行mkdir ~/.vim/.backup;mkdir ~/.vim/.swp;mkdir ~/.vim/.undo;在~/目录下创建.vimrc文件,并将以下内容添加到.vimrc文件中syntax on"configure encode"write file with follow encodingset fileencodings=utf-8,ucs-bom,gbk,gb18020,gb2312,cp936"output to te
2020-09-05 18:46:18
250
1
原创 搭建嵌入式开发的vim环境【1】requirements安装
前提在嵌入式开发中,vim是常用的开发工具和代码阅读工具,熟练使用vim会大大提高开发效率。我将从零开始搭建一个用于嵌入式开发的vim环境,本文记录搭建过程方便自己以后使用。需求我希望这个vim环境能提供的功能如下:能快速的找到变量,函数,符号的定义在哪里能直接查看当前文件包含的所有声明,类似与source insight的功能打开vim界面之后,最好能够不用退出就能打开其他文件环境准备系统:ubuntu-18.04编译器:需要安装gcc的编译环境sudo apt install -
2020-09-02 21:15:48
439
原创 rust学习------[day1]环境搭建以及基础概念的介绍
rust环境搭建编译器的安装前提是使用vpn,在ubuntu中执行以下命令curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource ~/.cargo/env替换cargo源在.cargo目录中创建config文件,内容如下:[source.crates-io]registry = "https://github.com/rust-lang/crates.io-index"replace-with = 'us
2020-06-26 13:57:34
395
原创 linux内核中实现的引用计数机制——kref
引用计数优点:具有实时性,一旦变量没有被引用,就会把变量给释放掉kref机制:是linux内核中使用的引用计数机制,下面介绍一下,在内核中该如何使用引用计数这个技术,首先,在设计自己的数据结构时,要包含struct kref结构的字段。数据结构和初始化数据结构示例:struct my_data{ ... struct kref refcount; ......
2020-06-26 10:07:03
1867
原创 简单的makefile语法介绍
makefile语法special variables特殊变量资料Archive filemakefile中的规则例子:foo.o : foo.c defs.h cc -c -g foo.c会去比较foo.o新还是foo.c和defs.h新,如果是后者,就会执行第二行的语句,更新foo.o规则的语法格式targets : prerequisites ...
2020-04-21 13:34:29
313
原创 linux device driver学习——day1编写自己的模块
学习目的搭建驱动开发的环境,能够编译自己的模块预备知识如何编译自己的模块1. 下载对应版本linux源码树,用于构建模块2. 编写自己模块的makefile需要了解的是linux的kbuild系统,这里简单介绍一下模块的makefile的通用写法/* Makefile:单个源文件编译的模块 */obj-m := hello.o/* Makefile:多个源文件编译的模块 */...
2020-04-20 18:02:28
198
原创 从Uefi的历史开始------BIOS和Uefi
Legacy BIOS’ backgroundLegacy BIOS的定义:BIOS的主要作用就是设置硬件,加载启动操作系统。当计算机启动的时候,BIOS初始化并辨认系统设备,包括video display card, keyboard, mouse, hard disk drive和其他硬件。然后,BIOS会找到启动设备上保留的软件,把设备的控制交给计算机(booting or boot st...
2020-03-30 23:43:54
2451
原创 server端网络连接建立的流程
一、创建socket1、int socket(int __domain, int __type, int __protocol)作用:创建一个socket,__domain的value值,常用的几个值:(用于设置网络通信的域,根据这个参数选择通信协议族)PF_UNIX,PF_LOCAL:本地通信AF_INET,PF_INET:IPv4 internet协议PF_INET6:IPv6...
2020-01-08 13:55:28
356
原创 使用makefile编译freeRTOS
freeRTOS的文件结构FreeRTOS-LabsFreeRTOS-Plus 包含freeRTOS+的组件和demo项目FreeRTOS 包含内核和demo项目Source目录:三个必须文件list.c queue.c task.c和其他的一些附加的文件include目录存放内核的头文件portable目录存放与内存管理相关的内容、与架构和编译器相关的内容,前者里面关注的是h...
2020-01-07 19:59:51
2690
原创 rtthread在cortex-m4架构芯片的启动流程
rtthread在cortex-m4架构芯片上的启动流程startup_pisces.S:栈的配置(stack段)堆的配置(heap段)异常向量的配置(vector段)(暴露__Vectors地址)Reset_Handler(text段)配置栈指针把数据从只读的内存复制到RAM中,这里有两种方案(1.复制多个段;2.只复制一个段)(这里采用方案2)从代码看是将__etext段的内...
2019-12-30 19:09:13
1012
原创 Cortex-m4架构学习
#cortex-m4架构支持的功能与快中断处理结合的高性能处理性能带有大量的breakpoint和trace功能的增强型系统debug功能高效的处理核,系统和内存带有集成的睡眠模式和可选的深度睡眠模式的超低功耗平台安全的鲁棒性,带有可选的集成MPU##一些组件WIC:The Wakeup Interrupt Controller (WIC) is a peripheral t...
2019-12-26 19:35:43
4391
原创 使用core dump对程序进行调试
一、介绍首先是core dump的定义:当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做core dump。其实,除了内存信息,还有关键的程序运行状态也会同时dump下来,如寄存器信息、内存管理信息、其他处理器和操作系统状态和信息。二、开启core dump在linux中打开core dump有两种方式:使用ulimit开启,判断...
2019-12-23 20:24:37
310
原创 device tree中基础属性的解释
devicetree的结构节点名字 node-namenode-name@unit-addressnode-name应该能够描述设备的一般类别unit-address是特定于节点所在的总线类型,unit-address必须与reg指定的地址保持一致,如果node没有reg属性,则在同一级中node的名字必须唯一,且unit-address需要省略。属性 properties属性(pr...
2019-12-23 20:10:42
1181
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人