自定义博客皮肤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)
  • 收藏
  • 关注

原创 Cmake实例分析

Cmake与autotools一样都是生成makefile的工具,但其步骤更清晰明了,这里做一下解析。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码。

2023-11-29 14:01:59 121

原创 【Linux】kernel与应用消息队列的一种设计

Linux进程间通讯的方式有很多种,这里介绍一种通过消息队列的方式来实现kernel与APP之间的消息收发实现方式,这种方式特别适用于,kernel中发送消息,应用层收取消息。

2023-11-17 10:31:30 239

原创 C语言 coding style

头文件#define的保护文件的唯一性,防止被多重包含格式 : __H_头文件的包含顺序C SystemFilesOtherLibraries作用域。

2023-09-19 09:45:33 508

转载 linux时间函数总结(转)

注意:strftime函数的第一个参数字符串buffer一定要初始化,否则可能会出现错误。

2023-09-06 21:59:32 1706

原创 cmake error:does not appear to contain CMAKEList.txt

需要检查一下CMAKEList.txt文件的权限,我这边在win10主机上git clone下载的代码,copy到ubuntu上,在ubuntu上执行cmake,提示找不到CMAKEList.txt文件,排查了一圈,是因为权限问题。将文件权限修改后,可以正常执行cmake,希望帮助有用的小伙伴。吐槽一下,这个cmake的错误提示有点low啊。

2023-08-11 14:48:33 1342 1

原创 win10+Vmware+ubuntu18 mosquitto调试记录

记录一下在建立mqtt调试环境上遇到的问题及对策。我的PC环境为,win10为办公环境,Vmware虚拟机安装ubuntu18,虚拟机主要用来进行代码编译,建立mosquitto server测试环境。

2023-08-10 15:39:14 209

原创 一些常见的工具整理

是一个开源、快速、只有头文件的C++11日志库,code地址在https://github.com/gabime/spdlog,基础示例在https://github.com/gabime/spdlog#readme。MQTT 最初作为一种轻量级的发布/订阅消息传递协议而设计,如今已经成为工业物联网(IIoT)和。它的意义在于实现了各类工业设备与云端的无缝连接,促进了。是一个为现代C++(C++11)设计的JSON解析库,主要特点是。(OT)和信息技术(IT)的融合。,在启动时的内存占用不到 1M。

2023-06-25 13:28:40 518

原创 C语言 socket学习整理

分三个topic来熟悉C语言的socket使用方法。

2023-06-08 16:20:28 2174

原创 基于MIPS的backtrace调试

首先来看一下当应用层出现错误,默认的linux-kernel输出的错误信息。不过kernel本身已经提供了很多打印现场的函数,我们在这里调用试试看效果。看起来kernel对应用层引发的异常不够重视啊,我们来想办法改善一下。果然由usermode引发的异常打印的信息很有限。下面函数打印了现场的寄存器信息及stack数据。

2023-05-19 17:04:25 868

原创 一个简单的makefile示例(c)

编译前修改目录TARGET?= test%.o:%.cclean:

2023-05-17 15:16:01 317

转载 C语言工程的通用makefile模板(转载)

在Linux或者嵌入式单片机中开发c语言程序,可能没有集成开发环境IDE,因此需要我们自己用gcc命令行编译,但是工程量大,为了提高编译效率,又不得不用makefile,因此c语言工程的一个通用的makefile编译脚本就需要了,下面就是我借鉴别人的模板(该模板是将一个文件夹中的所有源文件当成一个工程,然后进行自动编译。

2023-05-12 11:20:57 184

原创 vscode + python + jupyter notebook环境配置

安装完毕Python后,我公司的电脑需要额外将下面两个环境变量添加到 PATH中,否则无法从cmd命令行启动python及pip等。参考网络上的大神文章,在公司PC上搭建Python+vscode环境,做一下记录。安装完毕后,在python安装路径下,运行命令行,示例如下。pip install xxx 用来安装各种插件。请在PATH中新建并将这两个路径上移到最上面。pip list 用来查看已经安装的插件。

2023-04-20 14:45:33 1317

原创 Python实作练习100题(部分)

利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?

2023-03-30 11:28:09 542

转载 Python Coding Style

如果你的代码旨在用于国际环境,请不要使用花哨的编码。Python 默认的 UTF-8 或者纯 ASCII 在任何情况下都能有最好的表现。始终应使用 self 来命名第一个方法参数 (有关类和方法的更多信息请参阅初探类)。使用空行分隔函数和类,以及函数内的较大的代码块。以一致的规则为你的类和函数命名;使用4个空格缩进,不要使用制表符。一行不超过 79 个字符。

2023-03-30 09:25:32 78

原创 Python Start from 0(going on)

使用单引号和双引号表示字符串的方式是等价的,使用单引号时,字符串中可以包含双引号,使用双引号时,字符串中可以包含单引号。fotmat作为Python的的格式字符串函数,主要通过字符串中的花括号{},来识别替换字段,从而完成字符串的格式化。花括号的对数跟参数数量需要一致。

2023-03-14 10:42:18 336

原创 Linux字符设备驱动模型小记

设备用platform_device表示,驱动用platform_driver进行注册,Linux platform driver机制和传统的device driver机制(通过driver_register进行注册)相比,一个明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动中使用这些资源时通过platform device提供的标准结构进行申请并使用。上述步骤封装在函数中,通过module_init/xxx_initcall让kernel在启动阶段自动调用该驱动函数。

2023-03-13 15:12:59 206

原创 解释linux下应用层调用驱动(hello)

创建一个hello的设备来举例应用层如何调用kernel驱动,kernel驱动部分为转载,仅对部分语句做解释。init函数创建"hello_class"以及"hello"设备,这两个设备分别挂载在如下路径:/sys/class/hello_class/dev/hello将驱动编译进kernel内核后,我们来写一个app打开该设备,调用设备驱动的接口。注意一下open函数的设备名称为:"/dev/hello"

2023-03-07 14:44:43 645

原创 Linux驱动加载的几种方式module_platform_driver/module_init/xxx_initcall

如果该设备驱动依赖于其他设备的驱动,咱们最好理顺这些设备的加载顺序,不要一股脑的使用module_platform_driver/module_init 这些封装好的接口来加载驱动,因为内核并不清楚各个模块的加载顺序。而module_platform_driver是module_init的一种封装,linux发展出来的platform_bus而带来的接口。最常用的module_init其实最终调用的就是xxx_initcall。

2023-03-06 15:13:17 515

转载 常见的10种算法

栈维护了每个函数调用的信息直到函数返回后才释放,这需要占用相当大的空间,尤其是在程序中使用了许多的递归调用的情况下。递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。当C程序中调用了一个函数时,栈中会分配一块空间来保存与这个调用相关的信息,每一个调用都被当作是活跃的。幸运的是我们可以采用一种称为尾递归的特殊递归方式来避免前面提到的这些缺点。一般是给定一个某字段的值,找具有该字段值的节点。堆的增长方向为从低地址到高地址向上增长,而栈的增长方向刚好相反(实际情况与CPU的体系结构有关)。

2023-02-22 09:39:04 162

转载 Linux系统启动过程中的initcall实现原理和调试方法

1. 介绍在linux kernel启动过程中,通过initcall机制调用初始化函数。initcall作为kernel经典设计机制之一延续至今。在2018年,Steven Rostedt为了跟踪调试各个初始化函数的耗时,增加了tracing功能。在本篇文章中,会介绍initcall的意义和使用方法、实现原理、执行流程以及调试方法。2. 意义和使用方法正如文章最开始的地方所描述的那样,其直接意义是在kernel启动过程中执行不同的初始化函数,涉及到不同架构下的CPU初始化以及各种外设驱动的初始化。

2023-02-02 13:14:34 958

原创 一种简易的Nor flash存储数据机制

Nor Flash的特性如下:擦除:将“0”变为“1”,擦除单位为 page或者sector。写:只能将“1”变为“0”,写入单位为32 bits。Serial Flash:内部集成了SPI接口的一种Nor Flash,一般应用为外部通过SPI接口与MCU连接,相对于片上Nor Flash通常容量较大(4~32M Bytes),设计为:以Sector为单位进行擦除,以Page为单位进行编程。而MCU片上Nor Flash通常容量较小(小于4M Bytes),设计为:以page为单位进行擦除,以32位整字/1

2022-12-06 09:19:33 617

转载 ST Flash模拟EEProm x-cube-eeprom(转载)

原项目使用了一颗AT24C02来存储系统配置参数,为了降低成本,需要把这颗料砍掉,将配置参数保存到MCU内部的Flash上。表示共使用了多少个PAGE来模拟EEPROM,它的值取决于配置和移植的多个宏。所以在配置好除START_PAGE_ADDRESS外的宏后,根据配置去计算PAGES_NUMBER的值。轻量级其实是相对的,对于最简单擦写,1个page就可以了,比这个还轻量。EEPROM_Emul还是挺轻量的,没几个文件,就两部分核心实现和flash接口。,包括了这些特性,实用性更强。

2022-11-29 15:52:09 618

原创 正则表达式:Regular Expression

vi/sed/awk/grep等工具皆使用正则表达式的语法规则。正则表达式就是处理字符串的方法。特殊符号代表意义[:alnum:]代表英文大小写字符及数字,亦即 0-9, A-Z, a-z[:alpha:]代表任何英文大小写字符,亦即 A-Z, a-z[:blank:]代表空格键与 [Tab] 按键两者[:cntrl:]代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等[:digit:]代表数字而已,亦即 0-9[:graph:]

2022-11-25 21:10:33 818

原创 MIPS架构的启动地址随笔

MIPS架构的cpu在上电、重启的入口地址为0xBFC0 0000,这段空间在 kseg1 (0xA000 0000 ~ 0xBFFF FFFF) 512M Bytes。0x82af2000这个地址位于kseg0地址段(0x8000 0000~0x9FFF FFFF)512M Bytes,这段空间的特点是将最高位清零,将其转换到低512M物理地址。LDFLAGS_u-boot是链接uboot.bin时用到的变量,man ld查看-Ttext选项的意思是定义text段的起始链接地址。-T选型是指定链接脚本。

2022-11-22 16:24:04 403

原创 Windows下Vscode找不到头文件的分析

因gcc在linux环境下编译没问题,肯定不是makefile本身的问题,问题出在vscode或者windows下。windows下vscode无法识别相对路径“./”,只能识别绝对路径。在linux server上使用gcc编译正常。但在指定的路径下,头文件肯定是存在的。修改makefile,将。路径下有如下目录结构。

2022-11-21 10:59:09 1985

原创 Linux下NANDFLASH probe函数分析

arch.info.init由宏DT_MACHINE_START()和宏MACHINE_START()-> of_flat_dt_get_machine_name()[获取dts文件中”/”node下的model或compatile字符串.]最后将device_node链表赋给of_root,即of_root代表所有的device_node的list的。解析后的device_node如何变成platform_device,并注册到platform_bus_type的klist_devices链表中?

2022-11-07 16:57:25 399

原创 GD32 Timer+ADC多通道+DMA+PWM调试记录

本例记录使用GD32307C开发板,实现以内部Timer1 CH1为触发源,触发ADC0的两个通道,进行并行非连续采样,病通过DMA传输采样结果。同时输出PWM,用来检测Timer1 CH1的触发周期。

2022-11-02 16:47:07 3752 1

原创 FreeRTOS移植 --- base on gd32f30x + gcc

前述已经搭建好 WIN10+VSCODE+GCC+JLINK的开发环境,开发板为GD32307C,对应mcu型号为GD32F30x系列。今天将FreeRTOS移植过来,这里记录一下移植过程。

2022-10-20 11:18:02 1059

原创 GD32F307VC+WIN10+VSCODE+GCC+JLINK环境build

GD32F307VC+WIN10+VSCODE+GCC+JLINK环境build

2022-10-10 11:09:35 2577

原创 C++ 拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值运算符示例分析

作为C++新人,常常不明白上述四种C++函数/运算符的意义及分别在什么情况下会执行对应的函数/运算符。拷贝构造函数(Copy constructor):由已有的类拷贝创建一个新类,调用该构造函数。 函数参数为:class-name& (左值引用),其中 class-name 是为其定义构造函数的类的名称。class Window{ public: Window(const Window& a){ } // ...};拷贝赋...

2022-01-24 11:26:32 908 1

原创 准备给老婆大人的生产工具(转载),待实作。

##python 读取pdf文本内容#!/usr/bin/env python3#-*- coding:utf-8 -*-# pip3 install pdfminer3kfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.layout import LAParams, LTTextBoxHorizontalfrom pdfminer.pdfparser import PDFParser, PDFDocumentf..

2021-12-17 09:06:49 86

转载 c++ 日志输出库 spdlog 简介

参考文章:log库spdlog简介及使用 - 网络资源是无限的 - CSDN博客http://blog.csdn.net/fengbingchun/article/details/78347105spdLog的使用 - 烟消bug云散的专栏 - CSDN博客http://blog.csdn.net/yanxiaobugyunsan/article/details/79088533官方参考文档: QuickStart · gabime/spdlog Wiki · GitHubhttps:/..

2021-01-07 15:14:39 4570 2

原创 linux kernel CMDLINE初始化

Cmdline是由bootloader传给kernel,如uboot,将需要传给kernel的参数做成一个tags链表放在ram中,将首地址传给kernel,kernel解析tags来获取cmdline等信息。向linux kernel中添加cmdline有下面三种方式:1、 在dts中的bootargs中添加,CONFIG_MIPS_CMDLINE_FROM_DTB/ { chosen { name = "chosen"; bootargs = "rd_...

2020-10-15 19:33:47 708

转载 STM32L4时钟系统(转载)

1. STM32L4 时钟树概述时钟系统是 CPU 的脉搏,就像人的心跳一样。STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率。比如看门狗以及 RTC 只需要几十k的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的 MCU一般都是采取多时钟源的方法来解决这些问题。首先让我们来看看 STM32L4 的时钟系统图:在 STM32L475 中,有 6 个重要的时钟源,为 HSI、 HSE、 LSI、 LSE、 M..

2020-08-13 11:32:24 4198

原创 STM32L4 TIM定时时间的计算

目前使用的STM32L4系统时钟设定为80MHZ;每次进入中断服务程序间隔时间为时间=1/频率×次数((1+TIM_Prescaler )/80M)*(1+TIM_Period )定时器的基本设置:TIMx_Handler.Instance = TIM2; //选择TIM2TIMx_Handler.Init.Prescaler = 8000-1; //时钟预分频数 例如 :时钟频率=80M/(时钟预分频+1)TIMx_Handler.Init.CounterMod...

2020-08-13 10:47:39 2075

原创 buildroot下打开gdb调试

gdb编译过程:1.make menuconfig2.select "gdb "in Target packages--> Debugging,profiling and benchmark --> gdb3.select "full debugger"4.Build options--> gcc optimization level选择optimization level 05.Build options -->strip command for binaries on.

2020-07-16 16:14:16 3390

转载 C++函数模板(转)

C++函数模板函数模板是一种特殊的函数,可以使用不同的类型进行调用,对于功能相同的函数,不需要重复编写代码,并且函数模板与普通函数看起来很类似,区别就是类型可以被参数化 函数模板通过template与typename两个关键字来定义,如下:上边就定义了一个变量交换的函数模板,在使用函数模板时有两种方式 -自动类型推到调用Swap(a, b) -具体类型显示调用Swap<int>(a, b) 下边以代码来体验一下函数模板#include ...

2020-06-16 10:12:34 144

转载 std::vector简介及其使用(转)

std::vector简介及其使用本文中的vector指的是std::vector C++11标准。Vector概述template <class T,class Alloc = allocator <T> > class vector; //通用模板  vector是表示可以改变大小的数组的序列容器。  就像数组一样,vector使用连续存储空间存储元素,这意味着它们的元素也可以使用指向其元素的指针进行偏移来访问,并与数组一样高效。但与数组不同的是, v.

2020-05-25 19:08:49 5206

转载 nlohmann 最优秀的C++序列化工具库 详细入门教程(转)

C++使用nlohmann json教程使用指南:1.include#include <nlohmann/json.hpp>// for convenienceusing json = nlohmann::json;2.compile with(编译选项)-std=c++113.makefileCMakeLists.txt# CMakeLists.txt find_package(nlohmann_json 3.2.0 REQUIRED) ...add_.

2020-05-25 16:00:21 4479

原创 Linux 内存空间使用情况概览

free查看内存使用情况如下:total used free shared buffers cachedMem: 123124 95328 27796 244 28612 20916-/+ buffers/cache: 45800 77324Swap: ...

2020-04-30 21:25:05 440 1

空空如也

空空如也

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

TA关注的人

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