自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

漫长当下

知识就是这样,知道得越多,知道得越少。

  • 博客(66)
  • 资源 (2)
  • 收藏
  • 关注

原创 我的git代码仓库

https://gitee.com/wei513723

2020-04-15 20:35:59 569

原创 AMD64内存属性详解

本文参考文档为,版本号3.41,这不是对原英文文档的翻译,但是所有内容的排版都是根据原手册的排版来的,如有与官方文档冲突的内容,以官方文档为准。Host内存属性:Guest内存属性:由于Guest没有MTRR的硬件支持,MTRR属性可以通过嵌套页表模拟,所以可以假设嵌套页表的内存属性就是Guest的MTRR属性。为了让Guest使用的内存其属性完全由Guest决定,一般都会将嵌套页表、hPAT、物理MTRR对应的Guest可见的内存全部映射为WB。

2023-11-11 18:35:59 324

原创 可执行程序各段描述笔记

文章目录程序的组成代码段数据段bss段堆栈测试用例程序的组成一般来说一个可执行程序主要包含以下几个段描述:代码段(.text)数据段(.data)bss段(.bss)堆(.heap)栈(.stack)代码段程序编译后的各种可执行指令,占用ROM大小;数据段数据段通常包含只读数据段(.rodata)和读写数据段(.rwdata),占用ROM和RAM大小;bss段存放未初始化的全局变量、显示初始化为0的全局变量、static修饰的变量,占用RAM大小;堆用于动态内存分配,需要程

2022-04-13 10:57:32 986

原创 笔记:使用buildroot构建根文件系统

文章目录简介构建过程buildroot包下载配置Target options配置项Build options配置项Toolchain配置项System configuration配置项Kernel配置项Target packages配置项Filesystem images配置项编译简介引用自维基百科:Buildroot是一组Makefile和Patch文件,用来简化和自动化为嵌入式系统建造一个完整和可引导的Linux环境的过程,特别是在使用交叉编译来允许在单一的基于Linux的开发系统上为多个目标平

2022-02-12 20:22:35 1394

原创 stm32使用半满中断实现的高可靠串口数据收发

文章目录写在前面软硬件环境初始实现方式第一次优化写在前面串口在各种项目中可谓是太常用了,它也是搞嵌入式必须弄懂的一个通信协议,最近维护了很久的一个项目,设备内另一模块程序更新后出现了不稳定的情况,现象就是某个功能有时候正常有时候不正常,经排查是通信接口上出现了丢包导致的,通信的接口正是用的串口,然后经过多次优化,解决了问题,以此记录一下优化过程。软硬件环境软件:MDK5、stm32 HAL库硬件:主控芯片为stm32f407zet6,整板外设用了5个串口,2个硬件定时器。初始实现方式由于是自定

2021-09-30 10:27:10 7444 9

原创 MISRA-C规定不许用柔性数组?那就自己实现一个吧

文章目录写在前面为什么不让使用柔性数组如何替代写在前面最近公司安排参与一个项目,设备运行环境是在低轨,对稳定性要求很高,之前没接触过相关的项目,便试图找一下有没有航空相关的嵌入式C语言编程规范,于是网上搜索了一番,发现并没有完全针对这方面的内容,但是在汽车行业有一个名叫MISRA-C的规范文档,目前航空产业也开始在使用了,我也就下载了相关的资料了解了一下,但本文的重点不是这份编码规范,而是针对编码规范中的一条。为什么不让使用柔性数组下面是MISRA-C 2012的规范文档给出的解释,大概意思就是说柔

2021-07-30 10:18:52 363

原创 按键扫描,你还在用老掉牙的方法?

文章目录写在前面特点及实现使用写在前面网上各种方法就不评论了,直接讲重点吧,本次介绍的方法不管是什么单片机,也不管是裸机编程还是带RTOS的都是通用的,就算是linux也能轻松移植,这篇文章相当于是前面写的一篇文章的补充(链接在此),有兴趣想了解原理的可以先阅读前面的文章再阅读本篇文章。特点及实现软件采用分层及模块化的思想,所有扩展功能都是可按需裁剪的,按键数量无限制,键盘无限制,完全无阻塞,最强功能支持已定义的任意状态之间的任意组合,只要你按得出来。目前已支持和未支持的功能: 按下触发 弹

2021-05-15 10:25:52 530 1

原创 stm32程序跑起来后,擦除指定的函数?

文章目录写在前面我的想法第一步写在前面前两天在一个讨论群里面,一位同行提了一个问题,就是能不能程序跑起来后擦除某个指定的函数。诶,这问题可以啊,虽然我没有使用这个功能的需求,但是有人问那肯定就有人用,正好公司也没啥事,就花了两个小时鼓捣了一下,成功的实现了,下面记录一下操作的方法。我的想法看到这个问题,我的第一反应就是通过分散加载脚本来实现(具体是什么,自行网上搜索),因为之前搞过’uboot’('uboot’里面一般称作链接脚本),根据之前的经验,觉得’smt32’应该也是可行的,只需要知道函数存

2021-02-06 14:35:39 1076

原创 我的开源小项目

文章目录ramlogsoft_timer这些都是我平时做项目积累下来的一些可复用的代码,目前只整理了部分,后续会将其它的全部整理出来,希望能对你有所帮助。ramlog一个简单轻巧的log系统,可方便的将内容打印到自己想要存放的地方。soft_timer用于嵌入式中扩展系统的定时器资源。欢迎扫码关注我的微信公众号...

2020-12-28 11:44:10 744 2

原创 linux内核的宏:container_of

文章目录源码GNU扩展语法实现原理再看源码如何使用在编写驱动程序时,经常会用到container_of宏,这个宏的作用很强大,它根据结构体中一个已知成员的名字及其地址推导出整个结构体的起始地址,正因为有了这个宏,内核中经典的数据结构代码才得以高效复用。下面来简单剖析一下这个宏。源码摘自linux-5.7.8版本源码,它们还有很多变种宏,但是原理是一样的,只不过可能更加安全而已。#ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t) &am

2020-09-07 21:47:20 222

原创 C语言的柔性数组,可能你听过,但未实际用过

文章目录语法形式特性如何使用特性验证我在项目中的使用总结引用外网的一段内容(原文链接):Flexible Array Member(FAM) is a feature introduced in the C99 standard of the C programming language.For the structures in C programming language from C99 standard onwards, we can declare an array without a

2020-09-04 21:38:14 313

原创 linux驱动开发(5、使用leds驱动框架点亮led灯)

文章目录使用驱动框架的优势leds驱动框架相关在前面已经用创建通用字符设备的方式完成了led的操作,本次总结记录的是使用linux内核提供的leds驱动框架来点亮led灯。使用驱动框架的优势linux内核为各种硬件进行分类,然后针对各类硬件实现一套比较标准的驱动框架,其中每类硬件共有属性那一部分由内核开发者负责实现和维护,然后给驱动开发者留出接口用来完成具体硬件的特定操作部分。更加简化了驱动开发者的编码工作。leds驱动框架相关相关的源代码位于drivers/leds/目录内,头文件位于inclu

2020-08-27 22:23:55 2912

原创 linux驱动开发(4、操作硬件)

文章目录

2020-08-19 22:18:16 255

原创 linux驱动开发(3、自动创建设备节点)

文章目录udev与mdev配置mdev热插拔检测常用接口class_create函数class_destroy函数device_create函数device_destroy函数驱动中的修改在之前的内容中,执行应用程序之前,都要手动使用mknod命令来创建设备节点,这种方法非常的不方便,实际上现在的内核已经提供了一些接口,加上一个用户空间程序就可以实现自动删除与自动创建。udev与mdev引用维基百科的一段描述:udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev

2020-08-17 21:33:28 505

原创 linux驱动开发(2、第一个字符设备驱动)

文章目录设备号的申请和注销接口register_chrdev_region函数alloc_chrdev_region函数unregister_chrdev_region函数其它宏定义设备号的申请和注销设备号是一种资源,更是应用层与驱动层之间的纽带,设备号由主设备号和次设备号组成,主设备号用于区分是哪类设备,次设备号用于区分某一类设备中的各个子设备;设备号的分配规则是从大往小分配,其中某些设备号是系统已经约定好了的预分配给指定设备;当向内核申请了设备号后,就可以在/proc/devices文件中看到对应

2020-08-15 22:01:17 247

原创 threadx netx创建http客户端

文章目录需求搭建环境编写http客户端代码注意点测试结果需求前面已经移植好了协议栈netx,也完成了UDP通信的测试,说明移植方面应该是没有其它什么问题了。准备开展后续的工作,因为需求的原因,我需要将板子作为http客户端来请求web服务器的数据,然后处理及显示。搭建环境开始时我打算用以前学习的goahead来搭建web服务器,然后进行测试,但是没有调试成功,web服务器运行在我的ubuntu中,抓包的时候发现从我的主机(windows)到ubuntu有连续的往来数据包,但都是SYN包,没有ACK等

2020-08-05 17:59:57 1142

原创 笔记:linux驱动开发(1、了解内核模块)

文章目录一个最简单的驱动模块驱动编译的Makefile相关命令错误解决:一个最简单的驱动模块一个精简的驱动模块可以只有不到10行的内容,如下是一个简单的测试程序。#include <linux/init.h>#include <linux/module.h>#define DEBUG(fmt, ...) \ do{ \ if(if_debug) \

2020-08-04 21:02:57 272

原创 笔记:threadx netx使用BSD封装层创建UDP客户端

文章目录BSD封装层我的开发及测试环境添加BSD层编写udp线程测试验证BSD封装层引用维基百科的一段描述:伯克利套接字(英语:Internet Berkeley sockets) ,又称为BSD 套接字(BSD sockets)是一种应用程序接口(API),用于网络套接字( socket)与Unix域套接字,包括了一个用C语言写成的应用程序开发库,主要用于实现进程间通讯,在计算机网络通讯方面被广泛使用。它有一套标准的套接字接口,与底层分离,这样的话,程序就可以方便的互相兼容,目前netx支持的套接字

2020-07-30 15:33:11 839

原创 笔记:stm32移植threadx netx网络协议栈

文章目录写在前面源码下载准备工作开始搬运分析总结写在前面注意本文以分析为主,主要讲解实现过程和注意点,并非从零开始标题虽然是移植,但是完全参考官方提供的一份例程,即Azure_RTOS_6.0_STM32F746G-DISCO_STM32CubeIDE_Samples_2020_05_29.zip,其主控是STM32F746G,我用的是STM32F407,不过差别不大。目前已经能够成功ping通网络,但是ping不了大包,测试出来大概包长度只能到1470字节左右,此仅为个人笔记,所以可能存在不妥或者

2020-07-29 21:54:13 4736 3

原创 笔记:使用busybox制作根文件系统

文章目录busybox源码下载配置于裁剪解压源码配置编译busybox源码下载根据自己的选择下载合适的版本,本文以1.31.1为例,下载链接:busybox配置于裁剪解压源码tar -xf busybox-1.31.1.tar.bz2配置make menuconfig配置交叉编译器前缀,sysroot路径,安装目录,我这里直接安装到我的nfs挂载的目录(如果无法删除原有路径,按住ctrl加退格键可删除):Settings (/usr/bin/arm-linux-gnueabi-) C

2020-07-26 21:44:31 1741

原创 stm32移植threadx rtos

文章目录写在前面准备移植开始移植验证最后一点点击下方阅读原文可访问文中超链接写在前面ThreadX 是由 Express Logic 公司开发的实时操作系统。目前已被微软收购,并且前不久开源了,当开源的时候很多论坛都第一时间发布了相关文章,可见其影响力还是很不错的,刚好最近有一个新项目,需要用到网络协议栈,而threadx有自己的网络协议栈组件,之前打算用freeRTOS加LWIP的方式,现在直接用threadx加netx的方式。首先到github上下载threadx的源码,建议使用git,下载zi

2020-07-23 21:12:25 3816 3

原创 linux系统移植-s5pv210

内核的下载还是和u-boot移植的步骤差不多,首先是要选择一个版本,然后下载镜像,确保能够正确编译成功。对于版本的选择,因为我是学习用,所以选择较新的版本,我看了一下目前版本比较新且是稳定版的是5.7.8版本,所以决定采用这个版本的内核进行移植。下载链接如下:https://www.kernel.org/生成配置文件和u-boot的一样,也是首先生成.config配置文件,实际上u-boot那一套都是从内核这里移植过去的。解压内核后进入内核根目录运行如下命令:make ARCH=arm CROSS

2020-07-21 21:45:19 1222 1

原创 u-boot2020.04移植(小记:重定位前后保留的堆内存是如何被malloc的)

文章目录重定位前的堆内存池那当我们使用malloc时,它是如何给我们分配内存的呢?以malloc为例再来看下重定位后结论重定位前的堆内存池首先看一下重定位前,在重定位前也就是第一阶段,u-boot会保留一片内存用于堆,也就是gd->malloc_base这篇区域,其大小为0x400,具体见下面的内存图:图1那当我们使用malloc时,它是如何给我们分配内存的呢?在源码中搜索malloc可以在include/malloc.h中找到下面的宏定义:/*你可能发现很多重复的宏定义,但是经过分析,

2020-07-19 15:17:33 635

原创 u-boot2020.04移植(支持网络)

前面基于goni这块板子移植的u-boot并不支持网络,但是我的开发板上面是支持网络的,所以这里把网络支持添加上。先看一下硬件是怎样接的:DM9000属于类内存总线的设备,被映射到s5pv210的SROM区域,从图上可以知道它接在SROM的bank1,CMD接在ADDR2。从前面的过程分析我们知道,网络相关的初始化在board_init_r阶段,有两个相关的函数,下面来看一下:/*common/board_r.c*//*这个函数主要的作用是设置mac地址,但u-boot提供了可以随机生成mac地

2020-07-17 21:38:45 629

原创 u-boot2020.04移植(eMMC/SD调试)

文章目录前奏流程驱动匹配分析需要的属性调试结果前奏随着u-boot版本的变迁,u-boot的功能也越来越多越来越强大,在较新的u-boot中已经支持很多不同类型的文件系统,告别了以前需要移植者自己手动规划eMMC/SD等镜像存储介质的分区信息(并非真正的磁盘分区,只是一个标号而已),可直接使用相关的命令就可以读取出各种文件系统类型的存储介质中的文件,使烧录、更新、启动等操作变得更加方便,所以在u-boot中支持eMMC/SD卡是很有必要的。流程在我现在用的u-boot版本2020.04中mmc相关的

2020-07-15 17:30:52 3283 5

原创 u-boot2020.04移植(总结)

我所理解的u-boot移植可以分为以下几个部分:1、内核级的配置与初始化这个主要就是在start.S文件里面那些汇编代码,这部分呢我觉得基本上没有改的必要,除非你很熟悉内核相关的东西。2、SOC级别的配置与初始化这部分的内容是比较多的,而且可以说贯穿整个u-boot,但基本上必要的都集中在lowlevel_init,其它的就取决于你是否要在u-boot阶段使用某些硬件资源了,比如网卡是在board_init_r里面,已经是靠后的位置了,有些板子甚至可能都不会在u-boot阶段使用网络,自然也

2020-07-13 21:33:53 2158

原创 u-boot2020.04移植(6、board_init_r)

board_init_r和board_init_f差不多,都是执行一个循环,下面看下board_init_r干了些什么:/*common/board_r.c*/static init_fnc_t init_sequence_r[] = { initr_trace, initr_reloc, /* TODO: could x86/PPC have this also perhaps? */#ifdef CONFIG_ARM initr_caches, /* Note: For Frees

2020-07-11 19:56:15 1948 2

原创 u-boot2020.04移植(5、u-boot重定位)

第一阶段结束,开始u-boot的重定位,回到arch/arm/lib/crt0.S文件:

2020-07-09 21:33:42 3440 4

原创 u-boot2020.04移植(4、board_init_f)

接着上篇,执行了ldr pc, =_main后,就到arch/arm/lib/crt0.S文件了:ENTRY(_main)/* * Set up initial C runtime environment and call board_init_f(0). *//*未定义*/#if defined(CONFIG_TPL_BUILD) && defined(CONFIG_TPL_NEEDS_SEPARATE_STACK) ldr r0, =(CONFIG_TPL_STAC

2020-07-07 09:51:25 2325 2

原创 u-boot2020.04移植(3、lowlevel_init.S)

现在开始就进入板级相关的初始化了,跳转到board/samsung/goni/lowlevel_init.S文件,注意这里lowlevel_init搜索出来在arch/arm/cpu/armv7/lowlevel_init.S文件里面也有,而且这个文件还被编译了,但仔细看一下就会发现,这个文件里面的lowlevel_init被声明成了弱属性,所以真正调用的是board/samsung/goni/lowlevel_init.S文件。ENTRY(cpu_init_crit) /* * Jump to

2020-07-05 18:47:04 1425 1

原创 u-boot2020.04移植(2、从链接脚本开始)

首先分析一下u-boot的链接脚本,这样就能够知道u-boot本身的大体组成及分布,在上一篇文章中,已经完成了u-boot的编译,在根目录下可以看到生成了一个u-boot.lds文件,这个文件就是u-boot的链接脚本,它是由arch\arm\cpu\u-boot.lds文件经过处理后得到的,其内容如下:OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)/*整个u-boot的入

2020-07-03 22:26:52 1434

原创 u-boot2020.04移植(1、u-boot的编译)

最近公司项目用到了xilinx的zynq7000 soc,开发方式有所不同,驱动的数据都是通过设备树来提供,以前没接触过,所以想系统的学习一下相关的内容,但是手头只有一块三星的s5pv210开发板,使用的u-boot和linux系统不支持设备树,只好自己移植,以此记录一下移植过程,加深理解与记忆,如果你也刚好有需要,欢迎参考与指正。我使用的虚拟机是ubuntu1804,选的u-boot版本是最新的2020.04(u-boot下载链接),由于三星提供的交叉编译工具链版本太低了,编译不了这个版本的u-boo

2020-07-01 22:39:54 2486 2

原创 如何使用C的volatile关键字

首先声明本文译自国外网站的一篇文章,原文链接如下:https://barrgroup.com/embedded-systems/how-to/c-volatile-keyword建议有条件的直接阅读英文原版。可能读了这篇文章后,你会有所怀疑,因为你平时可能遇到过下面出现的情况,但是你并没有添加volatile关键字,程序任然正常的运行,个人觉得可能有以下的原因:1.其实BUG出现了,但是难以复现,所以被你忽略了2.现在的优化器足够智能,即使打开了优化,也能避免这些BUG的出现

2020-06-08 19:33:31 717

原创 嵌入式web服务器goahead从移植到使用之用户验证

对于登录验证,goahead此版本已经原生支持了,所以使用非常简单,就只需要修改一个文件即可,下面看下具体怎么操作吧。goahead提供了三种验证方式分别是:Web Form Authentication(表单验证)Basic Authentication(基本验证)Digest Authentication(摘要验证)官方推荐使用的是表单验证,另外两种尽量不要使用,所以本文也只讲一下表单验证是怎么操作的,想了解另外两种的话去官网查一下文档就知道了。

2020-06-08 09:38:44 1667 6

原创 嵌入式web服务器goahead从移植到使用之cgi

cgi相关的处理程序已经集成到goahead源码了,可通过me.h配置文件中的宏(ME_GOAHEAD_CGI)来选择启用或者不启用,我们不需要添加额外的代码。官方提供了一个测试用的cgi程序,源码文件是test目录下的cgitest.c,并且已经生成了可执行文件放在test/cgi-bin目录下,但是这个可执行文件是在官方使用的环境中编译的,我们的环境可能无法运行,需要重新编译才可以,编译完后如果可以运行就说明初步成功了。

2020-06-01 23:30:11 706

原创 嵌入式web服务器goahead从移植到使用之文件上传

goahead的文件上传官方也已经提供了例程可以直接用,相关代码在test.c中

2020-05-28 10:18:52 651

原创 c++学习笔记(namespace)

假设有两个班级,A班有位同学张三,B班也有位同学叫张三,因为某种原因,两个班级需要合并,班级合并后就有两个名叫张三的同学,老师需要点名同学回答问题时,那到底该谁起立回答呢?这就产生冲突了,通常的办法可能是把年龄大的叫大张三,年龄小的叫小张三,这样就能够解决这个冲突了;而程序也是一样的,对于C/C++来说,我们编译程序后最终得到的都是一个bin文件,里面的符号都是没有隔离的,所以也会存在这种冲突;在C语言中我们基本只能靠程序员自己来规避这个问题,比如:函数名或变量名尽量带有特殊标识前缀或后缀;不会被外部文件访

2020-05-27 00:22:47 180

原创 嵌入式web服务器goahead从移植到使用之action

前面我们已经熟悉了goahead-test程序的基本使用方法,今天测试一下action。

2020-05-23 20:59:53 835

原创 嵌入式web服务器goahead从移植到使用之asp

在上篇文章中我们已经得到了goahead的源码及测试程序,这篇文章将讲解如何使用asp。

2020-05-13 20:46:48 869

原创 嵌入式web服务器goahead从移植到使用之移植篇

先附上源码链接:https://www.embedthis.com/goahead/download.html,目前官方最新版本是5.1.1。官方文档:https://www.embedthis.com/goahead/doc/。

2020-05-12 11:34:13 1263 10

hex一键烧写.rar

这是我现在工作中正在使用的,芯片型号为 STM32F407ZET6 ,如果你的芯片和我的一样,那么可以直接使用。

2019-10-07

Source Insight 4.0和谐文件

Source Insight 4.0和谐文件,本人版本4.00.0084亲测可用。。

2018-08-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除