![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编程之美
文章平均质量分 93
编程技巧
WALI-KANG
这个作者很懒,什么都没留下…
展开
-
利用MDK的FLM文件生成通用flash驱动
在进行Flash操作时,一般我们需要设计一套Flash抽象层,至少要包括flash的init,read、write、erase这些操作。但每更换一个单片机或者flash器件就要额外去编写flash驱动去适配init,read、write、erase。尽管有会者不难的属性加持,但适配所有的单片机或者flash器件,工作量也可想而知。本文为大家提供一个适配几乎任意单片机型号的flash驱动,之所以说是几乎,是因为我们这次要借东风,而这个东风就是Keil的FLM文件。原创 2023-01-08 15:06:39 · 7222 阅读 · 1 评论 -
支持任意数据类型的环形队列
一个C语言编写的支持任意类型的环形队列,代码开源连接:三、API 说明1. 初始化队列参数说明:参考代码:2. 入队参数说明:参考代码:3. 出队参数说明:参考代码:4. 查看参数说明:参考代码:5. 其他API队列是否为空复位PEEK出队所有查看的数据获取PEEK的状态恢复PEEK的状态获取队列的数据个数四、多类型原理说明以 为例,说明如何做到支持任意类型的数据,和不同个数的参数类型。宏DEQUEUE最终调用的是本队列默原创 2023-01-06 22:32:38 · 474 阅读 · 0 评论 -
OOPC精要——你的对象无处不在
领个对象回家过年吧原创 2022-01-23 10:16:25 · 706 阅读 · 0 评论 -
线程安全和可重入函数
先说结论可重入函数未必是线程安全的;线程安全函数未必是可重入的。可重入函数的概念可重入的程序(函数)允许在执行的过程中被打断,并在打断所执行的代码中再次安全的调用。若一个函数是可重入的,则该函数应当满足下述条件:不能含有静态(全局)非常量数据。不能返回静态(全局)非常量数据的地址。只能处理由调用者提供的数据。不能依赖于单实例模式资源的锁。调用(call)的函数也必需是可重入的。总之一句话:上述条件就是要求可重入函数使用的所有变量都通过函数的调用者提供。举例说明,设计一个发送字符串原创 2021-09-26 22:45:07 · 2458 阅读 · 1 评论 -
[小技巧]使用静态库lib提高TouchGFX的编译速度
准备工作:实验平台:硬件: RT-Thread官方ART-PI H750开发版,正点原子4.3寸RGBLCD屏(800*480)软件: TouchGFXDesigner v4.15和 STM32CubeMX V6.0.1,开发环境MDK v5.29以上,Visual Studio Code联系作者:加我微信,备注“加群”,加入技术交流群...原创 2020-10-26 22:47:36 · 1982 阅读 · 4 评论 -
[小技巧]使用vscode和armclang编译器改善keil开发效率
准备工作:实验平台:硬件: RT-Thread官方ART-PI H750开发版,正点原子4.3寸RGBLCD屏(800*480)软件: 最新版本的STM32CubeH7固件库,TouchGFXDesigner v4.14和 STM32CubeMX V6.0.1,开发环境MDK v5.29代码下载:联系作者:加我微信,备注“加群”,加入技术交流群...原创 2020-10-26 22:27:30 · 4096 阅读 · 0 评论 -
单片机堆栈分配
Code:表示程序所占用 FLASH 的大小(FLASH)。RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM)ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM)静态数据区(DATA):保存全局变量和static ...原创 2019-05-14 21:33:44 · 11521 阅读 · 4 评论 -
一文读懂指针的本质
地址: 所谓地址就是一个整形的数字(常数)。地址不包含任何类型信息。**指针:**指针分为指针常量和指针变量,单独说指针的时候,通常指指针常量,其中:指针常量=地址数组(常数)+类型信息指针变量=整形变量+类型信息变量 = * 指针指针 = &变量类型信息可以通过强制类型转换来实现,也就是大家熟悉的 (< Type >) 用法。地址数值的改变,则统一转化为普通整数以后再说。指针常量 = 整数常量 + 类型信息也就是:*指针常量 = (<类型信息> )整数转载 2020-08-18 16:03:43 · 1794 阅读 · 0 评论 -
OOPC精要——撩开“对象”的神秘面纱
前言:何为面向过程:面向过程,本质是“顺序,循环,分支”面向过程开发,就像是总有人问你要后续的计划一样,下一步做什么,再下一步做什么,意外、事物中断、突发事件怎么做。理论上来说,任何一个过程都可以通过“顺序,循环,分支”来描述出来,但是实际上,很多项目的复杂度,都不是“顺序循环分支”几句话能说清楚的。稍微大一点的项目,多线程,几十件事情并发, 如果用这种最简单的描述方式,要么几乎无法使用,缺失细节太多,要么事无巨细,用最简单的描述,都会让后期复杂度提升到一个爆炸的状态。何为面向对象:**面向对象,原创 2020-06-05 13:50:36 · 723 阅读 · 2 评论 -
simple fsm状态机模板应用笔记(二)——simple fsm语法规则
原文地址:https://www.amobbs.com/thread-5668532-1-1.html如何使用1. 如何定义一个状态机语法:simple_fsm( <状态机名称>, def_params( 参数列表 ))例子:/*! fsm used to output specified string */simple_fsm( print_string, def_params( cons转载 2020-05-10 21:59:44 · 1181 阅读 · 0 评论 -
simple fsm状态机模板应用笔记(一)——simple fsm的设计思维和哲学
原文地址:https://www.amobbs.com/thread-5668532-1-1.html说在前面的话好久没有整理代码了,最近一直在做ARMv8-M系统安全设计相关的研究,虽然忙,但不代表我对自己无聊的爱好——整理一些好玩的代码模板,或者说语法糖——失去了兴趣。人总是会变的,一段时间过去以后,发现过去写的代码真心看着“心累”——宏一律大写看着辣眼睛,比如以前写的状态机脚本,所有做“状态机脚本语法辅助”的宏都是大写,看着果然还是不舒服。这次,我修正了一下自己的编码风格:“所有宏和枚举都是大写转载 2020-05-10 20:32:26 · 843 阅读 · 0 评论 -
PLOOC模板学习笔记(一)——PLOOC的设计思维和哲学
原文地址:https://github.com/GorgonMeducer/PLOOC介绍PLOOC是使用ANSI-C(又名PLOOC ['plu:k])进行的受保护的低开销面向对象编程,它是一组经过精心修饰的C宏模板,这些模板可:为私有class成员提供保护注意:可以通过定义宏__OOC_DEBUG__来禁用保护,以方便调试。支持受保护的成员支持多重继承支持实现接口在某...转载 2020-05-07 21:54:52 · 2635 阅读 · 0 评论 -
模块的封装(四)——头文件的作用
认真说起来,头文件(Header File)是个短命的家伙——就整个编译过程来说,它的寿命是最短的。为什么这么说呢?关于头文件的话题,讨论起来那可是“孩子没娘,说来话长了”,既然是闲聊、你也不是等着这篇文章救命,那就不妨从头开始说起——先假设读者们都是不了解编译基本过程的初学者。一个编译(Compilation)过程通常至少分为三个阶段:预编译(Precompiling)、编译(Make)和链...转载 2020-05-07 10:10:58 · 994 阅读 · 0 评论 -
被遗忘的C结构体封装技术
1. 谁该阅读本文本文是关于如何减少C程序的内存占用的:手工重新排列C结构体的成员声明来减小尺寸。为了读懂它,你需要基本的C语言知识。如果你想为内存受限的嵌入式系统或操作系统内核写代码,你需要了解该技术。 如果你在处理很大量的应用程序数据时经常超出了内存限制,或是你非常想要减小缓存不命中的次数,了解该技术是很有用的。最后,理解该技术是其它难懂的C语言概念的入口。 你不是高级的C程序员除非你掌...转载 2020-02-17 22:32:35 · 587 阅读 · 0 评论 -
变量的本质和关键字
1、voidvoid 的字面意思是“空类型”, void *则为“空类型指针”, void *可以指向任何类型的数据。如果函数没有返回值,那么应声明为 void 类型。如果函数无参数,那么应声明其参数为 void千万小心又小心使用 void 指针类型任何类型的指针都可以直接赋值给void *,但void *不可以无需强制类型转换地赋给其它类型的指针。按照 ANSI(American ...原创 2020-02-17 20:35:26 · 293 阅读 · 0 评论 -
C/C++面向对象编程之多态
C/C++面向对象编程之封装C/C++面向对象编程之继承C/C++面向对象编程之多态1、类型转换先回忆一下C语言中经常使用数据类型的转换。数据类型转换的前提是,编译器知道如何对数据进行取舍。例如:int a = 10.9;printf("%d\n", a);输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如:float b = 10;printf("%f\n"...原创 2020-02-09 17:04:52 · 1500 阅读 · 0 评论 -
数组名和函数名是什么东西
数组名和函数名的本质都是一个地址一、数组a[]中a和&a的区别看个例子:#include <stdio.h>int main() { int a[5] = { 1,2,3,4,5 }; int *ptr = (int *)(&a + 1); printf("a=0x%x\n", a); printf("&a=0x%x\n", &a);...原创 2020-01-09 10:44:22 · 2365 阅读 · 4 评论 -
typedef的用法
始终记住typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换一、四个作用为基本数据类型定义新的类型名typedef unsigned char UINT8;typedef unsigned short UINT1...原创 2020-01-07 16:23:27 · 558 阅读 · 0 评论 -
#define的用法
始终记住#define的核心语义为 替换一、宏的定义与撤销#普通宏定义#define PI 3.14 //编译阶段替换掉宏#define T1 3+4 //容易产生歧义#define T2 (3+4) //添加括号后,语义清楚 float r = 1.0;float area = PI * r * r; int a = 2* T1 #宏替换后变成 ...转载 2020-01-07 10:45:20 · 412 阅读 · 0 评论 -
C/C++面向对象编程之继承
继承原创 2020-02-06 18:23:33 · 873 阅读 · 0 评论 -
C/C++面向对象编程之封装
封装原创 2020-02-06 18:22:53 · 1330 阅读 · 0 评论