![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
学习笔记
airuoshahen
这个作者很懒,什么都没留下…
展开
-
mdk c 语言 __attribute__
__attribute__用法attribute((used)) 向编译器说明这段代码有用,即使在没有用到的情况下编译器也不会警告!attribute((unused))向函数或变量可能不使用,这个属性可以避免编译器产生警告信息!attribute((aligned(n))) 作用是在给某对象分配地址空间时,将其存放的地址按照n字节对齐,这里n可取2的幂次方。字节对齐的作用不仅是便于CPU快...转载 2019-07-01 09:08:04 · 1761 阅读 · 0 评论 -
STM32F1 Programming manual学习笔记2.3
2.3 Exception modelException statesInactive:异常既不是运行态也不是挂起态Pending:异常正在等待被控制器控制服务,一个由外设或软件产生的中断可以改变相关中断的状态为挂起态Active:一个正在被处理器服务且没有完成的异常,注意:一个异常处理可以中断另一个异常处理的执行,在这种情况下,两个异常都处于运行态Active and pending...原创 2019-04-30 13:57:59 · 241 阅读 · 0 评论 -
代码大全学习笔记——第八章2
第八章8.3 错误处理技术错误处理技术的一些方法:返回中立值;换用下一个正确的数据返回与前次相同的数据换用最接近的合法值把警告信息记录到日志文件中返回一个错误码调用错误处理子程序或对象当错误发生时显示出错信息用最妥当的方式在局部处理错误10.关闭程序总结来说,其实就是根据实际情况来选择错误处理的方式,以上每一种方式都是针对特定情况的,所以根据自己的情况,来选择处理方式就...原创 2019-04-25 15:54:11 · 155 阅读 · 0 评论 -
代码大全学习笔记——第八章1
第八章 防御式编程——防御式编程的主要思想是:子程序应该不因传入数据错误而被破坏,哪怕是由其他子程序产生的错误数据。8.1 保护程序免遭非法输入数据的破坏做到“垃圾进,什么都不出”、“进来垃圾,出去是出错提示” 或 “不许垃圾进来”,下面是三种处理进来垃圾的情况:检查所有来源于外部的数据的值:一定要检查获取数据值的合理性,如检查数值范围,字符串检查长度等等;检查子程序所有输入参数的值:...原创 2019-04-25 14:49:02 · 177 阅读 · 0 评论 -
代码大全学习笔记——第十三章不常见的数据类型1
13.1 结构体用结构体来明确数据关系用结构体简化对数据块的操作:分散的数据就只能一个一个去赋值,如果是结构体那么就能直接memcpy用结构体来简化参数列表用结构体来较少维护13.2 指针用来理解指针的范例内存中的位置:常用16进制形式表示,在32位处理器中是一个32位的值如何解释指针所指的内容:与指针的类型有很大关系使用指针的一般技巧把指针操作限制在子程序或者类里面...原创 2019-05-08 14:01:24 · 123 阅读 · 0 评论 -
代码大全学习笔记——第十二章基本数据类型1
12.1 数值概论避免使用“神秘数值”:这样会使修改更可靠、更容易,并增加代码的可读性如果需要,可以使用硬编码的0和1,其他值都要有描述性表示预防除零错误:每次用到除法的时候,都要检查分母是否为0事类型转换变得明显避免混合类型的比较注意编译器的警告12.2 整数检查整数除法:7/10在整数除法中的结果为0检查整数溢出:在做整数乘法或加法的时候,要留心可能的最大整数检查中间...原创 2019-05-08 11:19:59 · 233 阅读 · 0 评论 -
代码大全学习笔记9
第七章7.6 使用函数时要特别考虑的问题什么时候使用函数,什么时候使用过程函数指有返回值的子程序,过程是指没有返回值的子程序当过程中存在判断时,最好在入参中加入状态变量用以返回判断结果,而不是用过程的返回值作为返回结果;原因是对子程序的调用和对状态值的判断写在一行代码中,增加了该条语句的密度,也响应地增加了其复杂度;设置函数的返回值检查所有可能的返回路径:写代码的时候,所有的返回...原创 2019-04-25 11:15:39 · 173 阅读 · 0 评论 -
linux内核设计与实现——第二章从内核出发
2.1 获取内核源码2.2 内核源码树arch——特定体系结构的源码crypto——Crypto APIDocumentation——内核源码文档drivers——设备驱动程序fs——VFS和各种文件系统include——内核头文件init——内核引导和初始化ipc——进程间通信代码kernel——像调度程序这样的核心子系统lib——通用内核函数mm——内存管理子系统和V...原创 2019-05-05 16:49:09 · 211 阅读 · 0 评论 -
linux内核设计与实现——第一章 linux内核简介
1.2 操作系统和内核简介应用程序调用内核空间程序来控制底层硬件,也就是说应用程序通过系统调用陷入内核;内核还要负责管理系统的硬件设备;处理器在任何指定时间点上的活动范围概括为下列三者之一:1、运行于内核空间,处于进程上下文,代表某个特定的进程执行;2、运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断;3、运行于用户空间,执行用户进程;1.3 Linux内核和传统Unix内核...原创 2019-05-05 15:50:25 · 344 阅读 · 0 评论 -
c语言学习小记——inline函数
转载1开始原创地址: https://blog.csdn.net/zqixiao_09/article/details/50877383一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存...转载 2019-04-25 09:17:51 · 619 阅读 · 0 评论 -
linux线程学习笔记
线程的优点1.有些情况下需要程序同时处理多个事情,因此需要多个线程;2.分离成多个线程,可以改善程序执行的性能;3.线程见的切换需要操作系统做的工作以及对资源的需求要小于进程线程的缺点1.需要仔细的设计;2.调试苦难;3.将大量计算分为两个部分,并不会提高计算的速度;线程编程1. 需要 #include <pthread.h>;2.int pthread_creat...原创 2019-05-05 13:17:23 · 87 阅读 · 0 评论 -
代码大全学习笔记——第十一章变量名的力量2
11.4 非正式命名规则与语言无关的命名规则的指导原则区分变量名和子程序名字:变量名和对象名以小写字母开始,子程序名字以大写字母开始区分类和对象:① 通过大写字母开头区分类型和变量,如 Widget(类名) widget(变量名);② 通过全部大写区分类型和变量,如 WIDGET(类名) widget(变量名);③ 通过给类型加“t_”前缀区分类型和变量,如 t_Widge...原创 2019-05-05 13:14:50 · 202 阅读 · 0 评论 -
STM32F1 Programming manual 学习笔记——2.5节
2.5 Power managementSTM32和Cortex-M3处理器睡眠模式降低功耗:睡眠模式关闭处理器时钟,其他系统和外设的时钟也许一直在运行深度睡眠模式关闭STM32系统和外设时钟的大部分,在产品级别,这对应于停止或备用模式。有关详情,请参阅STM32参考手册的“电源模式”一节2.5.1 Entering sleep modeWait for interrupt:WFI...原创 2019-04-30 14:38:32 · 199 阅读 · 0 评论 -
代码大全学习笔记——第九章1
第九章 伪代码编程过程9.1 创建类和子程序的步骤概述类的创建方式有很多,一般而言都是一个迭代过程创建一个类的步骤创建类的总体设计:抽象概念,定义接口,类隐藏的属性,是否派生等等,不要指望一下就全部做好,迭代 很重要创建类的子程序复审并测试整个类创建子程序的过程9.2 伪代码我个人的做法呢,每要实现一个功能就添加一句概括性的注释,然后用函数来实现这个注释,完成代码之时,注释...原创 2019-04-30 16:05:24 · 138 阅读 · 0 评论 -
代码大全学习笔记——第十七章不常见的控制结构
17.1 子程序中的多处返回如果能增强可读性,那么就使用return用防卫子句(早返回或早退出)来简化复杂的错误处理:从审美的角度来说,把子程序的主体缩在4条if语句里面很难看,在这种情况下,如果先检查错误情况,用这些代码来为正常的执行路径清路,那么代码的布局有事可能变得更清楚,如果错误需要进行处理,那么可以为不同的错误,添加不同的返回值,从而进行不同的错误处理减少每个子程序中return...原创 2019-05-16 14:43:33 · 237 阅读 · 0 评论 -
代码大全学习笔记————第十六章控制循环
16.1 选择循环的种类计数循环执行的次数是一定的,可能是针对每位雇员执行一次连续求职的循环预先并不知道将要执行多少次,它会在每次迭代时检查是否应该结束无限循环一旦启动就会一直执行下去迭代器循环对容器类里面的每个元素执行一次操作什么时候使用while循环检测位于循环的开始:用while循环检测位于循环的结尾:至少要执行一次,用do-while循环什么时候用带退出的循环C、C+...原创 2019-05-16 13:29:59 · 283 阅读 · 0 评论 -
arm指令__attribute__((at(addr)))的应用
假如程序设定的起始地址为0,const uint32_t VALID_DATA __attribute__ ((at(0x00010000))) = 0xAABBCCDD;那么你生成的程序的bin文件或者hex文件的大小至少要大于0x10000,并且你从flash的0x2000这个位置下载bin文件,那么你就会在flash的0x12000这个位置读到0xAABBCCDD;至于const的地址小于程...原创 2019-05-21 16:08:53 · 4516 阅读 · 0 评论 -
C primer学习笔记--const
const数组名不能作为实参传递给非const参数函数把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的,然而只能把非const数据的地址赋给普通指针函数参数用const修饰,并不是要求实参必须是const,而是该函数在处理实参数据时将其视为常量,不可修改像函数处理指针的时候,如果不能修改指针指向的数据,那么应该这样定义参数const int *p或in...原创 2019-05-15 22:30:10 · 255 阅读 · 0 评论 -
代码大全学习笔记————第十五章用条件语句
15.1 if语句简单if-then语句首先写正常代码路径,再处理不常见情况确保对于等量的分支是正确的:即注意off-by-one的错误把正常情况的处理放在if后面而不要放在else后面:间隔放置正确和错误处理会影响代码的可读性让if字句后面跟随一个有意义的语句考虑else字句:经典分析发现,有5到8成的if语句都应该配有一个else字句,因此可以在else中写一个空语句,来表明el...原创 2019-05-15 11:49:33 · 191 阅读 · 0 评论 -
代码大全学习笔记——第十四章组织直线型代码
14.1 必须有明确顺序的语句原创 2019-05-15 11:12:58 · 218 阅读 · 0 评论 -
代码大全学习笔记——第十一章变量名的力量3
11.5 标准前缀标准化的前缀由两部分组成:用户自定义类型(UDT)的缩写和语义前缀用户自定义类型缩写个人理解:用户自定义类型是用户根据自己编程中的需求自己定义的(与编程语言无关的)特定的用于区分的类型语义前缀标准前缀的优点提供标准化,因此需要记忆的名字更少标准化的前缀使名字变得更加紧凑11.6 创建具备可读性的短名字缩写的一般指导原则使用标准的缩写去掉所有非前置元音...原创 2019-05-07 17:00:11 · 171 阅读 · 0 评论 -
代码大全学习笔记——第十三章不常见的数据类型2
13.3 全局数据大多数有经验的程序员已经得出结论:使用全局数据的风险比使用局部数据大与全局数据有关的常见问题无意间修改了全局数据与全局数据有关的奇异的和令人激动的别名问题:这是vb程序的一个问题,但我觉得对于C程序,不会出现这个问题,希望有某个大神给予指正与全局数据有关的代码重入问题:由于多线程应用的问题,全局数据会存在共享等问题全局数据阻碍代码重用与全局数据有关的非确定的初始化...原创 2019-05-09 14:15:39 · 140 阅读 · 0 评论 -
代码大全学习笔记——第十章使用变量的一般事项2
10.5 持续性持续性具有多种形态:特定代码段或子程序的生命期,例如for循环里声明的变量只要你允许,它就会持续下去;比如malloc或者new的变量,直到你free或者delete才会消失程序的生命期。大多数语言的全局变量都有这个特性,C++和Java中的static也是如此永久持续,这一类变量可能包括你存储在数据库中的数据在编程过程中,可能会存在变量已经消失,你却去访问它了,还...原创 2019-05-01 15:09:21 · 163 阅读 · 0 评论 -
代码大全学习笔记——第十章使用变量的一般事项1
10.1 数据认知数据认知测试10.2 轻松掌握变量定义隐式声明语言中的建议关闭隐式声明声明全部的变量遵循某种命名规则检查变量名10.3 变量初始化原则不恰当的变量初始化从未对变量赋值:它的值只是程序启动时变量所处内存区域的值变量值已经过期:变量在某个地方曾经被赋值,但该值已经不再有效变量的一部分被赋值,而另一部分没有避免初始化错误的建议在声明变量的时候初始...原创 2019-04-30 17:28:45 · 259 阅读 · 0 评论 -
代码大全学习笔记——第九章9.4
9.4 伪代码编程过程的替代方案伪代码编程过程是创建类和子程序的最佳方法测试先行开发:在任何代码之前先要写出测试用例重构:该方法通过对代码进行一系列保持语义的变换和调整来提高代码的质量契约式设计:即认为每一段程序都具有前条件和后条件东拼西凑:属于社会主义初级阶段的产物要点创建类和子程序通常都是一个迭代的过程。在创建子程序的过程中获取的认识常常会反过来影响类的设计;编写好的伪代码...原创 2019-04-30 16:19:02 · 139 阅读 · 0 评论 -
代码大全学习笔记8
第七章7.5 如何使用子程序参数减小接口错误的指导原则按照输入-修改-输出的顺序排列参数:暗示内部程序执行的操作为输入数据,修改数据,最后输出数据;考虑自己创建in和out关键字:个人认为这种方式不是很好,无缘无故增加宏定义IN和OUT来修饰参数影响代码的可读性;如果几个函数都用了类似的一些参数,应该让这些参数的顺序保持一致使用所有参数把状态和出错变量放在最后不要把子程序的参数用...原创 2019-04-24 22:07:17 · 118 阅读 · 0 评论 -
代码大全学习笔记——第十一章变量名的力量1
11.1 选取好变量名的注意事项最重要的命名注意事项容易理解,事实上它们都不需要什么解释,最好从字面就能理解有些名字太长,长的很不实用,不过后面会讲到长度的问题以问题为导向一个好记的名字反映的通常都是问题,而不是解决方案最适当的名字长度当变量名的平均长度在10到16个字符的时候,调试程序所花费的力气最小,平均长度在8到20个字符的程序也几乎同样容易调试;意思就是名字太短时,就...原创 2019-05-05 10:57:12 · 201 阅读 · 0 评论 -
程序编译流程笔记
1.预处理:进行语法验证等;2.编译 .c文件生成.s文件(汇编文件)3.汇编文件生成.o文件(2进制文件)4链接:将多个.o文件合并成一个可执行文件原创 2019-09-29 11:29:38 · 75 阅读 · 0 评论 -
jlink远程下载笔记
领导之前让我找jlink远程下载的资料,我找了两个blog地址如下https://www.cnblogs.com/bh4lm/p/6733232.htmlhttps://www.yiboard.com/thread-663-1-1.html然后自己试着调通了,就觉得没啥东西,然后就抛到脑后了。一两个月后的今天,领导让我给客户远程升级,我找到书签里面的两个blog,看完我就懵逼了。好记性不如...原创 2019-09-29 11:30:25 · 696 阅读 · 0 评论 -
C++学习笔记之虚函数
1.联编是计算机程序彼此关联的过程,这个过程需要确定函数调用和执行函数调用的代码之间的映射关系,按照联编的不同阶段,可以分为静态联编和动态联编;2.静态联编:就是在程序运行之间执行的早期联编,那么在程序运行时就会按照静态联编的结果进行执行,这也就是为什么一直执行的时父类的func,也就是说如果父类和子类都有同一个函数的情况下,而且这个函数不是虚函数的话,那么无论是定义的子类还是父类的变量,去执行...原创 2019-09-29 11:31:48 · 78 阅读 · 0 评论 -
BBBLACK 嵌入式linux学习
启动流程:1.启动bootloader,使用uEnv.txt进行系统配置,执行初始化,加载linux kernel,并移交控制权;2.找到SD卡/eMMC,解压kernel到内存,设置外设、USB、I2C、HDMI等,挂载包括Linux应用程序在内的所有文件系统;3.条用第一个用户态程序进行初始化,从内核态转到用户态;kernel的内核模块(LKM)的作用是用那个驱动就加载那个驱动,内核空...原创 2018-12-15 12:54:51 · 516 阅读 · 2 评论 -
stm32 I2C DMA学习笔记
CUBE环境中的流程:1、使能DMA通道的NVIC;2、初始化I2C的配置,根据自己的需求修改通信速度就可以,然后再这个配置里面的io配置中会配置io的DMA通道;3、使用带DMA的发送接收函数就可以用DMA发送,在这个函数中,会使能DMA的中断,并将I2C中的I2C_DMAXferCplt配置为DMA的中断回调函数,这样就可以通过修改HAL_I2C_MasterRxCpltCallback...原创 2019-02-20 11:12:00 · 8264 阅读 · 0 评论 -
c语言笔记
#include <stdio.h>typedef struct{char a[2];int b[3];}test_str;int main(int argc, char *argv[]){test_str *pTest;test_str test[3];pTest = test+1;printf("%d,%d,%d,%d,%d\n",pTest,test,size...原创 2019-09-29 11:29:17 · 83 阅读 · 0 评论 -
STM32F1 Programming manual 学习笔记1
2.2.4 内存访问的软件顺序程序流程中指令的顺序并不能保证相对应的内存处理顺序,原因如下处理器可以重新排序一些内存获取用来提高效率,当然,这种改变不能影响指令顺序的行为处理有多个总线接口在内存map中的memory或devices有不同等待状态一些内存获取是缓冲的或者speculative(推测的,感觉这个翻译很牵强,但也不知道怎么翻译)如果内存获取的顺序十分重要,软件必须包含m...原创 2019-04-29 16:03:55 · 463 阅读 · 0 评论 -
代码大全学习笔记1
建立试验性原型试验性原型是为了解决如何判断你设计是否存在缺陷的问题;试验性原型的定义为:写出用于回答特定设计问题的、量最少且能够随时扔掉的代码的这项活动;试验性原型代码只是一个指导方向,并不是真正的产品代码;只有设计问题够明确够具体,才能进行试验性原型代码的进行,否则就没有任何意义;为了程序员能够指导试验性原型代码是可以随时扔掉的代码,可以用非项目的语言去实现(比如项目用的是c语言,可...原创 2019-04-23 10:48:53 · 258 阅读 · 0 评论 -
代码大全学习笔记7
第七章7.2 在子程序层上设计内聚性:指子程序中各种操作之间联系的紧密程度功能的内聚性:实现功能单一且与子程序名字相符顺序上的内聚性:意思就是一个子程序的执行,最好与另一个子程序的执行,没有依赖或者说顺序关系;通信上的内聚性:其实我个人的理解这个问题还是功能的内聚性;临时的内聚性:过程的内聚性:逻辑上的内聚性:如果子程序位移的功能就是发布各种命令,其自身并不做任何处理,这通常也是...原创 2019-04-24 13:10:25 · 134 阅读 · 0 评论 -
代码大全学习笔记6
第七章 高质量的子程序——子程序定义:子程序是为实现一个特定的目的而编写的一个可被调用的方法或者过程。7.1 创建子程序的正当理由降低复杂度:不过一旦程序写好了,你就应该能忘记这些细节,可以直接调用子程序而无须了解它的内部工作细节;引入中间、易懂的抽象:把一段代码放入一个命名恰当的子程序内,是说明这段代码用意最好的方法之一;避免代码重复;支持子类化;隐藏顺序:当程序有执行顺序的时候...原创 2019-04-23 10:46:27 · 134 阅读 · 0 评论 -
代码大全学习笔记5
第六章6.4 创建类的原因为现实世界中的对象建模;为抽象的对象建模;降低复杂度:类隐藏一些细节,你能在无须了解其内部工作原理的情况下使用这个类;隔离复杂度;隐藏实现细节;限制变动的影响范围;隐藏全局数据;让参数传递更顺畅:如果多个子程序都用一个参数,那么这个参数就可以作为类的成员变量;建立中心控制点:与信息隐藏有些类似;让代码更易于重用;为程序族做计划:你可以把预计要被改...原创 2019-04-23 10:15:06 · 352 阅读 · 0 评论 -
代码大全学习笔记——第八章3
第八章8.7 确定在产品代码中该保留多少防御式代码保留那些检查重要错误的代码去掉检查细微错误的代码去掉可以导致程序硬性崩溃的代码保留可以让程序稳妥地崩溃的代码为你的技术支持人员记录错误信息确认留在代码中的错误消息是友好的其实,以上的这些都是从产品出发,在不影响用户体验的使用的情况下,使程序能够稳定的运行8.8 对防御式编程采取防御的姿态其实大概的意思就是,我们要在保证程序稳...原创 2019-04-26 22:03:48 · 145 阅读 · 0 评论 -
代码大全学习笔记4
第六章6.3 有关设计和实现的问题——类内部的设计和实现包含(“有一个。。。”的关系)通过包含来实现“有一个”的关系;在万不得已时通过private继承来实现“有一个”的关系:这部分没有太看懂;警惕有超过约7个成员变量的类:研究表明人在做其他事情时能记住离散项目的个数是7±2;继承(“是一个。。。”关系)...原创 2019-04-23 10:50:19 · 180 阅读 · 0 评论