C/C++
嵌入式Linux系统开发
博主就职于芯片原厂,熟悉硬件、STM32单片机、嵌入式 Linux、Android。
展开
-
一文带你了解 CAN 总线
1、CAN 简介CAN:Controller Area Network,控制局域网络,最早由德国 BOSCH(博世)开发,,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线之一。BOSCH 主要是做汽车电子的,因此 CAN 一开始主要是为汽车电子准备的,事实也是如此,CAN 协议目前已经是汽车网络的标准协议。当然了,CAN 不仅仅应用于汽车电子,经过几十年的发展,CAN 协议的高性能和高可靠性已经得到了业界的认可,目前除了汽车电子以外也广泛应用于工业自动化、医疗、工业和船舶等领域。原创 2022-05-14 23:10:26 · 5124 阅读 · 0 评论 -
一文带你搞懂双链表
链表是常用的数据结构,为方便学习,对链表进行细分,分为五种:1、不带头节点的单链表2、带头节点的单链表3、不带头结点的双链表4、带头结点的双链表5、带头结点的双向循环链表链表基本概念头指针:头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针头指针具有标识作用,所以常用头指针冠以链表的名字无论链表是否为空,头指针均不为空,头指针是链表的必要元素头节点:头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度)原创 2022-04-18 22:19:14 · 313 阅读 · 0 评论 -
一文带你搞懂单链表
链表是常用的数据结构,为方便学习,对链表进行细分,分为五种:1、不带头节点的单链表2、带头节点的单链表3、不带头结点的双链表4、带头结点的双链表5、带头结点的双向循环链表本文先讲解单链表链表基本概念头指针:头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针头指针具有标识作用,所以常用头指针冠以链表的名字无论链表是否为空,头指针均不为空,头指针是链表的必要元素头节点:头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可原创 2022-04-18 22:18:15 · 390 阅读 · 0 评论 -
STM32启动文件
此为startup_stm32f103x_hd.s启动文件的内容Stack_Size EQU 0x00000400 系统设置的栈的大小。Heap_Size EQU 0x00000200 系统设置的堆的大小。接下来一大堆DCD的就是中断向量表,在STM32F103中,代码是从0x0800 0000开始存储的,并且中断向量表是在代码最开始的地方,所以中断向量表就是在0x0800 0000开始存储的。中断向量表的设置是单片机各种中断可以正常使用的必要设置。ARM原创 2021-04-19 15:27:26 · 271 阅读 · 0 评论 -
u8、u16、u32分别是什么
代表无符号整型数字的缩写,方便一些。经常出现在MDK中(keil5)开发STM32程序。/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */typedef int32_t s32;typedef int16_t s16;typedef int8_t s8;typedef const int32_t sc32; /*!< Read Only */typede原创 2021-03-26 17:14:37 · 5196 阅读 · 0 评论 -
为什么大家不用C语言解Leetcode题目?
最近在刷LeetCode,用的是c语言。有时候发现想不出来的的题目,去看一下别人的答案,但是很少有C语言来写的答案。大部分都是C++、Java之类的。原因用C语言做也可以,但C++里有STL很方便,C语言需要自己实现数据结构太累。不光是LeetCode,基本ACM选手也不会用C语言去打比赛,清一色的C++。实际上用c++的是用的是“c++的c语言部分”+STL。C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构原创 2021-02-24 11:45:24 · 2494 阅读 · 2 评论 -
VScode安装问题解析
This User Installer is not meant to be run as an Administrator. Ifyou would like to install VS Code for all users in this system,download the System Installer instead fromhttps://code.visualstudio.com. Are you sure you want tocontinue?说明:VSCode 通用编辑器目前原创 2020-12-27 15:53:54 · 1789 阅读 · 0 评论 -
微信公众号自动回复如何添加超链接
先用电脑进入公众号后台网页管理系统https://mp.weixin.qq.com/进入以后,在功能下面,有个自动回复,有三个选项,有“关键词回复”、“收到消息回复”、“被关注回复”。这里我们在被关注回复中设置超链接。格式为<a href="网址">名称</a>例如<a href="https://mp.weixin.qq.com/s/LIWoOQ-syR5gDSQIszD4Lg">自我介绍在这里</a>效果如下:欢迎关注我的微信公众号原创 2020-12-24 22:24:19 · 3057 阅读 · 0 评论 -
5.带头结点的双向循环链表
Dbilinkedlist.c#include "Dbilinkedlist.h"D_head * create_Dbilinkedlist_head(void){ D_head * h = malloc(sizeof(*h)); h->first = h->last = NULL; h->num = 0; return h;}void create_order_Dbilinkedlist(D_head * h){ DbiNode * p = NUL.原创 2020-11-04 15:49:54 · 252 阅读 · 0 评论 -
4.带头结点的双链表
bilinkedlistwithhead.c#include "bilinkedlistwithhead.h"head * creat_bilinkedlist_head(void){ head * h = (head *)malloc(sizeof(*h)); h->first = h->last = NULL; h->num = 0; return h;}void creat_order_linkedlist(head * h){ biNode * .原创 2020-11-04 15:48:03 · 131 阅读 · 0 评论 -
3.不带头结点的双链表
bilinkedlist.c#include "bilinkedlist.h"biNode * create_bilinkedlist(void){ biNode * p = NULL; //指向带加入的那一个数据结点 biNode * first = NULL; // 指向第一个结点的指针 int n; while(1) { scanf("%d", &n); if(n == 0) { break; } p = (biNode *)malloc(si.原创 2020-11-04 15:45:34 · 251 阅读 · 0 评论 -
2.带头结点的单链表
linkedlistwithhead.c#include <stdio.h>#include <stdlib.h>#include "linkedlistwithhead.h"/* create_head: 给链表创建一个头结点 无参数 返回值: 返回创建好的头结点的指针 struct head_node **/struct head_node * create_head(void){ struct head_node * head = NUL原创 2020-11-04 15:42:52 · 553 阅读 · 0 评论 -
1.不带头结点的单链表
linkedlist.c#include "linkedlist.h"#include <stdio.h>#include <stdlib.h>/* Create_linkedlist: 创建一个链表 void:无参数 返回值: 第一个节点的指针 Node **/Node * Create_linkedlist(void){ Node * p = NULL; //指向要插入的那个结点 Node * h = NULL; //指向链表的第一个结点 No.原创 2020-11-04 15:40:02 · 279 阅读 · 0 评论 -
手把手教你写链表
本文只讲逻辑,源码参考本文之下的五篇博客(关注后可以往下找)数据结构: 数据结构是计算机存储、组织数据的方式。数据:(data) 是对客观事物的符号表示。在计算机科学是指所有能够输入到计算机中并能够被计算机处理的符号的总数。数据元素: (data element) : 是数据的基本单位,在计算机通常作为一个整体进行描述或处理。数据项(data item):数据项数据的不可分割的最小单位。一个数据元素可以由多个数据项组成。数据对象(data object):是性质相同的数据元素的集合,是数据的一个.原创 2020-11-04 15:36:51 · 494 阅读 · 0 评论 -
C++中Lambda 函数与表达式
正常函数都是有名字的,比如 int main,或者int max等。C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。(就是没有函数名)(类似于宏定义)Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:[capture](parameters)->return-type{body}原创 2020-11-02 17:21:02 · 346 阅读 · 0 评论 -
死锁
死锁是怎么产生的--------两个原因2.进程推荐顺序不当 进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生死锁。 资源竞争不一定产生死锁。死锁怎么去避免死锁如何解除...原创 2020-10-31 21:38:44 · 173 阅读 · 0 评论 -
C语言引用头文件#include <stdio.h>和#include“stdio.h”的区别
#include "xxx.x"用引号,代表编译程序会优先在程序的本地目录搜索这个文件,找不到再搜索系统目录#include <xxx.x>用尖括号,代表编译程序只会在系统目录(系统环境变量和编译本身设置的默认搜索目录)搜索这个文件总的来说,一般是用双引号来引用自己编写的文件,而用尖括号引用系统标准的文件。<>搜索顺序为:系统目录–>环境变量目录–>用户自定义目录。""则是用户自定义目录–>系统目录–>环境变量目录.至于这区别带来的影响就是效原创 2020-10-19 17:25:50 · 4680 阅读 · 0 评论 -
C语言中 stdio.h 源码
/** * This file has no copyright assigned and is placed in the Public Domain. * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file DISCLAIMER.PD within this package. */#ifndef _INC_STDIO#define _INC_STDIO#原创 2020-10-18 15:43:27 · 3428 阅读 · 0 评论 -
error: ‘for’ loop initial declarations are only allowed in C99 mode
报错如下比如写出下面这段程序:for (int i = 0; i < n; ++i){ do_something();}然后用gcc编译,会报 ‘for’ loop initial declarations are only allowed in C99 mode的错误。原因是在循环条件中声明变量,只在C99标准中支持,C90标准不支持。所以改成:int i;for (i = 0; i < n; ++i){ do_something();}这样编译就可以通过原创 2020-10-17 22:03:36 · 285 阅读 · 0 评论 -
C语言三剑客:C陷阱与缺陷、C和指针、C专家编程
有需要的私聊我,发给你。原创 2020-10-16 17:43:41 · 819 阅读 · 4 评论 -
关于DSP28335或者DSP2812程序的小记录
DINT 关闭所有中断init Pie Ctrl 启动PIE中断系统init Pie Vect Table 设置中断向量表EALLOW和EDIS是汇编代码。成对出现,中间夹杂着不可以轻易改变的数据位,这些数据位如果没有EALLOW打开,是不可以改变的(内存保护)...原创 2020-10-09 18:25:56 · 404 阅读 · 0 评论 -
无操作系统时的设备驱动和有操作系统时的设备驱动
原创 2020-10-09 12:02:39 · 353 阅读 · 0 评论 -
线程池精讲(pthread pool)
线程池也是多线程的处理方式。是将“生产者”线程提出任务添加到“任务队列”,然后一些线程自动完成“任务队列”上的任务。多线程编程,创建一个线程,指定去完成某一个任务,等待线程的退出。虽然能够满足编程需求,但是当我们需要创建大量的线程的时候,在创建过程以及销毁线程的过程中可能会消耗大量的CPU.增加很大开销。如: 文件夹的copy WEB服务器的响应。 。。。。 。。。。 线程池就是用来解决类似于这样的一个问题的,可以降低频繁地创建和销毁线程所带来地开销。线程池技术思路: 一般原创 2020-09-25 20:26:49 · 1227 阅读 · 0 评论 -
宏定义中的反斜杠“\“和宏定义的细节说明
1. 转义字符非常常用的一种用法,在反斜杠后面加一个字符,表示一些特定的意思,如:\n 换行符(LF)\r 回车(CR) ,相当于键盘上的"Enter"\t 跳到下一个TAB位置\0 空字符(NULL)\' 单引号(撇号)\" 双引号\\ 代表一个反斜线字符''\' 等,详细可百度“转义字符”。2. 继续符可用于一行的结尾,表示本行与下一行连接起来C语言中以 ; 作为语句的结束,不以行为单位结束,当一行的内容太长不方便卸载一行时可使用反斜 杠""作为继续符例如:STM3原创 2020-09-24 21:36:54 · 2026 阅读 · 0 评论 -
warning: address of local variable ‘s’ returned [-Wreturn-local-addr]
#include<stdio.h>char *getstr1(){ char s[]="str1"; return s;}char *getstr2(){ char *s="str2"; return s;}void getstr3(char *s){ s="str3"; return;}int main(){ char *s1,*s2,*s3; s1=getstr1(); s2=getstr2(); getstr3(s3); printf("st原创 2020-09-24 21:34:18 · 7231 阅读 · 1 评论 -
C语言不同数据类型的输出printf
%d整型输出,%ld长整型输出,%p指针变量地址,如果数处数据不够8位数,则左边补零,%o以八进制数形式输出整数,%x以十六进制数形式输出整数,%u以十进制数输出unsigned型数据(无符号数)。%c用来输出一个字符,%s用来输出一个字符串,%f用来输出实数,以小数形式输出,%e以指数形式输出实数,%g根据大小自动选f格式或e格式,且不输出无意义的零。...原创 2020-09-24 19:24:19 · 1917 阅读 · 0 评论 -
C语言左移右移 << >>
C/C++语言中逻辑右移和算数右移共享同一个运算符>>。编译器决定使用逻辑右移还是算数右移,根据的是运算数的类型。C/C++中没有循环左移和循环右移打操作符,需要自己实现。原创 2020-09-24 19:19:37 · 326 阅读 · 0 评论 -
\n \r
\n是换行,英文是New line。\r是回车,英文是Carriage return。回车”(Carriage Return)和“换行”(Line Feed)这两个概念的来历和区别。符号 ASCII码 意义\n 10 换行\r 13 回车CR在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此)的玩意,每秒钟可以打10原创 2020-09-24 16:42:12 · 351 阅读 · 0 评论 -
C4996 ‘strcpy‘: This function or variable may be unsafe. Consider using strcpy_s instead. To disable
严重性 代码 说明 项目 文件 行 禁止显示状态错误 C4996 ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1 c:\users\administrator\source\repos\1\1\1.cpp 20VS201原创 2020-09-15 16:12:23 · 404 阅读 · 1 评论 -
int a=1; printf(“%d, %d, %d\n“, a, ++a, a++);
#include<stdio.h>int main(){ int a=1; printf("%d, %d, %d\n", a, ++a, a++); return 0;}1:知识点a++表示先用a后把a+1++a表示先把a+1,然后在用2.printf()语句多个参数的执行顺序,从右往左3:分析,从右往左:a++,先打印a=1,然后a+1,这时a变成2++a,a先加一,a=3,打印出来。a,直接打印3编译的时候从右向左,输出的时候从左向右。参考:主要是原创 2020-08-25 20:03:56 · 8903 阅读 · 4 评论 -
unsigned int无符号数与有符号数相加
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。#include<stdio.h>int main(void){ unsigned int a=6; int b=-20; printf("%d",(a+b)>6?1:0);}...原创 2020-08-16 16:16:20 · 239 阅读 · 0 评论 -
notepad++列编辑功能
当时看韦东山视频的时候,看到了老师用notepad++编辑一列,感觉很方便,遂记录。在Notepad++中,按住Alt键之后,就处于列(编辑)模式了。比如,按住Alt键,此处从上到下,选择多列:类似于这样,与行选中类似,可以很方便删除相同的东西。参考https://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htmls/index.htmlhttps://www.crifan.com/files/doc/docbook/rec_s原创 2020-08-03 17:12:59 · 1023 阅读 · 0 评论 -
C语言-给定某日期求为周几(使用基姆拉尔森计算公式)
#include<stdio.h> int main(){ int year,month,day; int total; scanf("%d %d %d",&year,&month,&day); if(month<3){ month+=12; year-=1; } total=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/原创 2020-07-29 15:02:40 · 391 阅读 · 0 评论 -
C语言实现冒泡排序
0.如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。1.原理:比较两个相邻的元素,将值大的元素交换到右边2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。(2)比较第2和第3个数,将小数 放在前面,大数放在后面。…(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二原创 2020-07-29 14:01:34 · 168 阅读 · 0 评论 -
main函数的参数
main函数可以不带参数,也可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为: main (int argc,char *argv[])由于main函数不能被其它函数调用,因此不可能在程序内部取原创 2020-07-28 09:50:51 · 2340 阅读 · 0 评论 -
分享一道运算符优先级题目
#include<stdio.h>int main(){ int sum; int a=3,b=5,c=4; sum=a&b<<c+a^c; printf("%d ",sum); return 0;} 先加再移位再与再异或答案原创 2020-07-23 11:33:34 · 429 阅读 · 0 评论 -
C语言打印数组以及打印注意事项
#include<stdio.h>int main(){ char buf[20] = {0}; int tmp[]={52,6,65,52,85,33,99,125,22,33,55,66,55,88,77,55,66,55,22,59}; int i; int m; for(i=0;i<20;i++){ buf[i] = tmp[i]; } for(m=0;m<20;m++){ printf("%d ",buf[m]);原创 2020-07-21 10:18:15 · 11977 阅读 · 0 评论 -
求矩阵主对角线元素及副对角线元素之和
#include<stdio.h>int main(){ int i,j; int a[3][3]; int s = 0,t = 0; for(i = 0;i < 3;i++) { for(j = 0;j < 3;j++) { scanf("%d",&a[i][j]); } } for(i = 0;i < 3;i++) s += a[i][i]; for(i = 0;i < 3;i++) t += a原创 2020-07-17 12:20:39 · 5033 阅读 · 0 评论 -
C语言求100~200之间的素数
① 要判断一个数是不是素数,首先要知道什么是素数。回忆一下数学里的知识,什么是素数?只能被自身和1整除的正整数是素数。1既不是素数,也不是合数;2是最小的素数,也是唯一一个是偶数的素数。② 判断一个正整数m是否为素数有多种方法。方法1:让m依次被2,3,…,m-1除,如果m不能被2~m-1中的任何一个整数整除,则m是素数。方法2:让m依次被2,3,…,m/2除,如果m不能被2~m/2中的任何一个整数整除,则m是素数。方法3:让m依次被2,3,…,sqrt(m)除,如果m不能被2~sqrt(m)中的任原创 2020-07-17 11:59:44 · 818 阅读 · 0 评论 -
结构体变量和结构体指针
结构体变量分配结构体本身大小的空间,结构体指针分配4个字节,其实任何类型的指针都是分配四个字节的指针空间。所以:A a[3]; //a里面是三个A变量,所以分配三个结构体大小A *a; //a是一个指针,分配4个字节,就算A再大,a也只是4个字节,因为任何类型的指针都是4个字节。要使用a,必须先要对指针初始化,也即分配空间了。如:A *a;a = (A*)malloc(sizeof(A));也就是如果在结构体中,定义了一个指针,那么会分配4个字节,但是这个指针你无法使用,你必须自己mal原创 2020-07-17 11:20:50 · 1066 阅读 · 0 评论