自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(71)
  • 收藏
  • 关注

转载 RTOS 做嵌入式开发的优势

第一、并发性程序并发工作效率低在写裸机软件时,不可避免的在主程序中会有一个超级大的 while(1) 循环,这里面几乎包含整个项目的所有业务逻辑。因为每个业务逻辑里面都会有 delay 这样的循环等待函数,这样导致了所有的业务逻辑几乎都是串行起来工作的。这个时候 CPU 就会有很多时间都浪费在了延时函数里,一直在空转,导致软件的并发效率非常差。第二、模块化:高内聚、低耦合的原则...

2020-03-30 12:59:56 488

转载 无人驾驶之激光雷达(三)

国内外最全的激光雷达企业分享接连两篇文章给大家普及了无人驾驶核心传感设备‘激光雷达’的技术原理、应用领域以及细分市场。今天,小天使终于可以把烹制已久的大餐分享给大家了:国内外最全面的激光雷达企业信息汇总!首先,咱们还是先看前三甲:Velodyne、Quanergy、Waymo。很抱歉,它们都属于美国,毕竟在高端科技方面,小天使也很无奈啊╮(╯▽╰)╭可以说,前三甲已经囊括了...

2020-03-20 11:54:13 531

转载 无人驾驶之激光雷达(二)

“无人驾驶罚单都出来了,无人驾驶还会远吗?”在去年,小天使第一次看到Robbin李说出这句话的时候,不可谓不激动。毕竟,国内能在无人驾驶技术上与谷歌等巨头相抗衡的,除了百度不做他想。但激动过后,冷静一想:不对啊,需求真的成型了吗?成本真的可控了吗?技术真的突破了吗?激光雷达,是的,但凡提到自动驾驶或者无人驾驶,始终避不开的难题:你能想象在整个汽车产业链中,我们几乎能掌控99.99%...

2020-03-19 12:14:55 1100

转载 无人驾驶之毫米波雷达(一)

毫米波雷达指工作在毫米波波段的雷达。通常毫米波是指30~300GHz频域(波长为1~10mm)的电磁波,毫米波的波长介于厘米波和光波之间,因此毫米波兼有微波制导和光电制导的优点。毫米波在5G通信、卫星遥感、导弹制导、电子对抗等领域有着广泛的应用,而近年来随着元器件水平的不断提升,电路设计、天线技术等相关技术日益发展和不断成熟,毫米波雷达的在汽车方面的应用也获得了很大的发展。毫米...

2020-03-19 11:01:13 1860

原创 嵌入式操作系统综述

常见的嵌入式系统有Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、Rtems 、QNX、INTEGRITY、OSE、C Executive。。除了WinCE的实时性稍差外,大多数嵌入式操作系统的实时性都很强,所以也可称为实时操作系统Real Time Operating Syste...

2020-03-18 12:57:47 506

转载 C++与C的联系与区别

C++与C的联系:  C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式--面向对象编程、泛型编程和过程化编程。其编程领域众广,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性!  C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过...

2019-09-15 16:29:39 259

原创 strstr函数实现

strstr()函数用来查找子串的首地址,函数实现如下:char* strstr(char * str1,char * str2){ char *p1=NULL; char *p2=NULL; while(*str1) { p1=str1; p2=str2; while(*p1==*p2 && *p2!=NULL) { p1++; p2...

2019-09-12 10:32:44 733

原创 单链表的反转

方法一:迭代法:ListNode * Reverse(ListNode *head){ if(head == NULL) return NULL; ListNode *pNode=head; ListNode *pNew=NULL; while(pNode!=NULL) { ListNode *temp=pNode-...

2019-09-08 15:38:34 102

原创 冒泡排序、简单选择排序、直接插入排序

#include<stdio.h>#define insertSortFlag 0#define direcSelectSortFlag 0#define bubbleSort 1int main(){ int num[10]={3,6,4,2,5,1,1,2,0,8}; int length=sizeof(num)/sizeof(num[0]); int t...

2019-09-07 00:03:18 153

原创 求最长递增子序列的长度

输入格式:输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开输出格式:最长单调递增子序列的长度输入样例:在这里给出一组输入。例如:51 3 5 2 9输出样例:在这里给出相应的输出。例如:4#include<stdio.h>#include<malloc.h>int solution(int a[],...

2019-09-04 21:00:28 366

原创 输入字符串的全排列

方法一:复杂问题分解为小问题:第一步:求所有可能出现在第一个位置的字符。第二步:固定第一个字符,求后面所有字符的排列。#include<stdio.h>#include<string.h>void swap(char *a,char *b){ char temp; temp=*a; *a=*b; *b=temp;}void solution(...

2019-09-04 12:43:47 301

原创 关于大小端存储判断的问题

大端存储与小端存储区别如下:小端存储:数据的高位数据放在高地址,低位数据放在低地址。大端存储:大端与小端的数据存储方式相反。数据的高位数据放在低地址,低位数据放在高地址。对于大小端存储判断的方式有两种:方法一:字符指针判断在32位平台下,int占4个字节,而char类型的指针是占一个字节的,如果我们把int强传为char类型的指针,只会保存一个字节的数据,那么我们只需要判断...

2019-08-25 16:50:41 461

原创 可剥夺型内核与不可剥夺型内核的区别

由于嵌入式系统只有一个CPU,因此在一个具体时刻只能允许多个任务中的一个任务使用CPU。根据系统中的任务获得使用CPU的权利的方式,多任务实时操作系统的内核分为可剥夺型内核和不可剥夺型内核两种类型。但无论在两种类型的内核中,每一种任务都必须具有一个唯一的优先级别来表示它获得CPU的权利。 不可剥夺型内核也叫合作型多任务内核。在这种内核中,总是优先级别高的任务最先获...

2019-08-23 17:42:10 3337

原创 判断两个字符是否异位

判断两个字符是否异位?例如,abcdef和badcfe, 或abcde和badce。程序如下:#include<stdio.h>#include<string.h>void judge(char* arr1,char* arr2,int length1,int length2);int main(){ char arr1[20]; char arr2[...

2019-08-20 11:41:15 871

原创 给定一个任意大小的数组,将所有的0放在后面,其他的数字顺序保持不变。

给定一个任意大小的数组,将所有的0放在后面,其他的数字顺序保持不变。例,数组{1,3,0,3,6,0,0,9},输出为{1,3,3,6,9,0,0,0}。程序如下:#include<stdio.h>void swap(int *a,int *b);void conver(int*arr,int length);int main(){ int arr[8]={1,3,...

2019-08-20 10:53:25 929

原创 判断输入的IP地址是否合法

方法一(比较复杂):#include<stdio.h>#include<string.h>int main(){ char arr[20]; int i=0,count=0; bool flag=1; scanf("%s",&arr); if(strlen(arr)>13 || (arr[3]!='.') || (arr[7]!='....

2019-08-18 17:33:42 1433

原创 二进制与十进制的相互转换

二进制转十进制程序如下:思路:判断二进制的每一位是否为“1”,若是“1”,加上该位对应的2的倍数。#include<stdio.h>int main(){ long num,a=10,b=1,add=0; printf("输入的二进制数为:"); scanf("%d",&num); while(num!=0) { add=add+(num%a ? b...

2019-08-18 16:42:28 196

原创 直接插入排序(C语言版)

直接插入排序:#include<stdio.h>void swap(int *a,int *b);int main(){ int a[11]={10,4,7,3,9,2,4,6,8,2,3}; int i,j; int length=sizeof(a)/sizeof(a[0]); for(i=1;i<length;i++) { for(j=i-1;j&g...

2019-08-18 09:56:17 134 1

原创 快速排序(C语言版二)

快速排序:#include<stdio.h>void quicksort(int * arr, int left,int right);void swap(int *a,int *b);int main(){ int arr[10]={2,6,3,9,5,2,0,23,12,1}; int length=sizeof(arr)/sizeof(arr[0]); qu...

2019-08-17 10:48:16 126

原创 C语言 二分查找(循环实现)

二分查找(循环实现):#include<stdio.h>int main(){ int arr[10]={1,3,4,5,8,9,10,15,26,30}; int val=20; int left=0; bool flag=1; int mid; int right=sizeof(arr)/sizeof(arr[0])-1; while(left<ri...

2019-08-16 22:48:28 678

原创 C语言 二分查找(递归实现)

二分查找(递归实现):#include<stdio.h>int fun(int *arr,int start,int end,int val){ int mid=(start+end)/2; if(start<end) { if(arr[mid]==val) return mid; else if(arr[mid]>val) retu...

2019-08-16 20:42:43 1651 2

原创 RS232、RS485、RS422的区别

RS232、RS485、RS422的接口图如下所示,RS232的缺点:(1) 接口的信号电平值较高,易损坏接口电路芯片,又因为232电平与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接;(2) 传输速率较低,在异步传输时,波特率为20Kbps。现在由于采用了新的UART芯片,波特率达115200bps(1.832M/16);(3) 接口使用一根信号线和一根信号返回线而...

2019-08-16 12:30:48 2735

原创 嵌入式Web服务器

简介:嵌入式Web服务器通过无线WiFi的方式,实现TCP模拟HTTP协议。WiFi硬件采用esp8266模块,作为客户端,用户可以通过手机修改esp8266需要连接的WiFi账号与密码;作为服务器端,用户可以修改服务器参数,并将数据保存在EEPROM中,同时可将传感器采集到的信息在网页上显示并可实现下发控制功能。展示:1、手机端输入需连接的wifi账号和密码。2、服务器配置。...

2019-08-15 17:03:31 479

原创 智慧城市共享雨伞

项目介绍:全球共享经济处于高速发展期,参与共享经济的人口不断增多,共享经济平台收入大幅提高,共享经济领域不断拓展。共享雨伞由于其符合绿色出行、节省资源、环保理念,政府对这一新鲜事物也会极力提倡和支持。因此,智慧城市共享雨伞具有广阔的应用前景。本项目共享雨伞由雨伞端、智能锁、雨伞架和APP组成。通过RFID采集共享雨伞的状态,在局域网中通过RS485协议发送给网关(集中器)集中处理,网关再将状态...

2019-08-15 16:51:11 1009

原创 汽车安全行驶报警系统

作品介绍:在车辆迅速普及的当下,减少交通事故的发生成为人们越来越关注的问题之一。驾驶员不安全行为主要有酒驾、超时疲劳驾驶、反向行驶、注意力分散等,这些不安全的驾驶行为非常容易引起交通事故,造成不可挽回的后果。“汽车安全行驶报警系统”具有检测酒驾与疲劳驾驶的功能。通过指纹识别与图片采集来识别驾驶员的身份信息,采用人脸特征检测和车道偏离检测双重方式来判断驾驶员的疲劳状态,通过酒精检测模块来检测驾驶...

2019-08-15 16:46:23 549

原创 二维数组行列数的计算

定义数组为intarray[A][B];sizeof(array[0][0])为一个元素占用的空间,sizeof(array[0])为一行元素占用的空间,sizeof(array)为整个数组占用的空间,那么:行数 = sizeof(array)/sizeof(array[0]);列数 = sizeof(array[0])/sizeof(array[0][0]);...

2019-07-22 20:56:05 1739

原创 二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。bool find(int a[], int num){ int hang=sizeof(a)/sizeof(a[0]); int lie=sizeof(a[0])/sizeof(a...

2019-07-22 20:49:29 76

原创 输出数组中重复的数字

void fun(int number[], int length){ if(number == NULL || length <= 0) printf("error"); if(length < 0 || length > n-1) printf("error"); for(int i=0; i < length...

2019-07-21 23:23:18 807

原创 比较两棵树,是否相等?

数据结构如下:typedef struct TreeNode{ char c; TreeNode *leftchild; TreeNode *rightchild;}程序如下:int compTree(TreeNode *Tree1,TreeNode *Tree2){ if((Tree1==NULL) != (Tree2==NULL...

2019-07-21 10:53:21 549

转载 哈佛结构/冯诺依曼结构详细分析

CISC与RISC的区别:CISC(复杂指令集):复杂指令集就是CPU在工作的时候需要有很多的汇编指令来完成,它可以用一个汇编指令来完成一件复杂的工作。例如:乘法,加法,乘加,乘减等处理的时候,他会每个处理方式用一条指令来完成。因此这种设计实际上是很强大的,因为同样处理一个运算,它可以用一个机器周期就可以完成了。但是其内部的硬件设计就相对而言的比较复杂了一些。而且,这样的设计势必就会遭成功...

2019-06-16 17:33:56 10372

转载 C语言之可重入函数 && 不可重入函数

可重入函数 在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料的后果。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。 满足下列条...

2019-06-13 17:02:15 138

转载 Flash、RAM、ROM详细介绍

一、 ROM(Read Only Memory) ROM(Read Only Memory),只读存储器。用来存储和保存数据。ROM数据不能随意更新,但是在任何时候都可以读取。即使是断电,ROM也能够保留数据。ROM也有很多种:PROM是可编程一次性(无法修改)的ROM;EPROM是紫外线可擦除可编程的ROM;EEPROM是电可擦除可编程的ROM,按字节进行删除和重写...

2019-06-02 22:24:17 554

转载 ROM, FLASH和RAM的区别

初学MCU的人,经常会看到ROM, RAM, FLASH,而且会被这些词汇搞得晕头转向。本文对这些概念进行了厘清,并介绍了这些Memory的区别,以及它们在MCU中的作用。ROM (Read Only Memory)程序存储器ROM全称Read Only Memory,顾名思义,它是一种只能读出事先所存的数据的固态半导体存储器。ROM中所存数据稳定,一旦存储数据就再也无法将之改变或者...

2019-06-02 21:40:38 140

转载 什么是红黑树?

什么是红黑树?————————————二叉查找树(BST)具备什么特性呢?1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树也分别为二叉排序树。下图中这棵树,就是一颗典型的二叉查找树:1.查看根节点9:2.由于10 > 9,因...

2019-05-30 14:45:05 73

转载 static关键字详解

static的作用:1、在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变;2、在模块内(但在函数体外),一个被表明为静态的变量可以被模块内所用函数访问,但不能被模块外其他函数访问。它是一个本地的局部变量;3、在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用。也就是,这个函数被限制在声明它的模块的本地范围内使用。一. 面向过程程序设计1、静态全局变...

2019-05-16 09:46:56 267

转载 socket编程二十六:基于UDP的服务器端和客户端

前面的文章中我们给出了几个 TCP 的例子,对于 UDP 而言,只要能理解前面的内容,实现并非难事。UDP中的服务器端和客户端没有连接UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程。也就是说,不必调用 listen() 和 accept() 函数。UDP 中只有创建套接字的过程和数据交换的过程。UDP服务器端和客户端均只需1个套接...

2019-05-15 10:13:45 2432

转载 socket编程二十五:再谈UDP和TCP

TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复 ACK 包确认,多种机制保证了数据能够正确到达,不会丢失或出错。UDP 是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据丢到网络中,也不需要 ACK 包确认。UDP 传输数据就好像我们邮寄包裹,邮寄前需要填好寄件人和收件人地址,之后送到快递公司即可,但包裹是否正确送达、...

2019-05-15 10:12:12 314

转载 socket编程二十四:gethostbyname()函数:通过域名获取IP地址

客户端中直接使用 IP 地址会有很大的弊端,一旦 IP 地址变化(IP 地址会经常变动),客户端软件就会出现错误。而使用域名会方便很多,注册后的域名只要每年续费就永远属于自己的,更换 IP 地址时修改域名解析即可,不会影响软件的正常使用。关于域名注册、域名解析、host 文件、DNS 服务器等本节并未详细讲解,请读者自行脑补。本节重点讲解如何使用域名。通过域名获取IP地址域名仅仅是 I...

2019-05-15 10:11:31 3754 1

转载 socket编程二十三:网络数据的大小端问题

不同 CPU 中,4 字节整数 1 在内存空间的存储方式是不同的。4 字节整数 1 可用 2 进制表示如下:00000000 00000000 00000000 00000001有些 CPU 以上面的顺序存储到内存,另外一些 CPU 则以倒序存储,如下所示:00000001 00000000 00000000 00000000若不考虑这些就收发数据会发生问题,因为保存顺序的不同意味...

2019-05-15 10:10:16 1927

转载 socket编程二十二:socket编程实现文件传输功能

这节我们来完成socket文件传输程序,这是一个非常实用的例子。要实现的功能为:client 从 server 下载一个文件并保存到本地。编写这个程序需要注意两个问题:1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能完成文件内容的发送。接收数据时也会遇到同样的情况。要解决这个问题,可以使用 while 循环,例如://Server 代码...

2019-05-15 10:08:56 9632 1

空空如也

空空如也

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

TA关注的人

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