![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
嵌入式相关
李嘉图Y
凡是过往,皆为序章
展开
-
安装arm-linux-gcc-4.4.3
安装arm-linux-gcc-4.4.31、下载交叉编译工具交叉编译工具包可以去以下网址下载:arm-linux-gcc-4.4.3.tar.gz2、解压下载交叉编译工具到根目录下(或者自己其他路径,但是自己要记住,方便后面配置.bashrc环境变量):sudo tar zxvf arm-linux-gcc-4.4.3.tar.gz -C /然后进入:/opt/FriendlyAR...原创 2020-03-30 13:57:12 · 1308 阅读 · 0 评论 -
Linux命令--tar
tar 用于可以为文件和目录创建档案。可以为某一特定文件打包(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。主选参数:主选参数仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩。-c :建立一个压缩文件的参数指令(create 的意思);-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件!辅选参数:-z :是否同时具有 gzip 的属性?...原创 2019-05-13 16:31:19 · 415 阅读 · 0 评论 -
Linux命令--grep和find命令
使用LInux很长时间了,以前只是使用Linux进行一些简单的学习,后来进行嵌入式LInux的学习,在进行Uboot和内核开发的过程中查找信息时使用grep命令和find命令就显得更加的方便。grep:查找指定目录下过滤文本文件中的行数据find :查找指定目录下文件grep命令格式:grep “text” * 【选项】选项:-A num, --after-context=...原创 2019-05-13 15:42:02 · 1522 阅读 · 0 评论 -
ubuntu安装samba服务器(win10环境下访问)
在嵌入式开发中使用samba服务器能够很方便的进行开发,我的电脑是win10系统,虚拟机里安装的ubuntu12.04,现在给大家提供一个简单的安装samba服务器的方法。第一步:网络选用net模式,保证虚拟机能够上网第二部:执行命令行:#sudo apt-get install samba 等待自动下载并安装#sudo apt-get install smbfs接着执行 #...原创 2019-04-25 22:53:10 · 1243 阅读 · 1 评论 -
u-boot的制作
使用的开发板是三星4412的开发板,u-boot用的是u-boot.2013.01版本。随后我会把相关的资料上传,需要的朋友可以下载使用1、uboot 源码获取方式1. 从 官网获取http://ftp.denx.de/pub/u-boot/老的uboot 版本不建议使用,遇到问题, 决绝难度大,太新的不要用rc 的 不要用, 属于测试版2. 也可以从芯片厂商 直接获取2、 boo...原创 2019-04-03 10:53:16 · 647 阅读 · 0 评论 -
嵌入式linux环境搭建
本人是嵌入式软件专业,除了学习STM32单片机之外,我还自学了u-boot的移植,文件系统的制作,以及Linux内核的移植,在学习嵌入式linux过程中也做了一些笔记,最近整理了一下,分享给大家,也供自己以后温习。今天分享的是环境搭建,用的是ubuntu12.04版本,交叉编译工具用的是gcc-4.6.4版本,随后可以把文件资料上传,有兴趣的朋友可以下载。1、硬件组成微处理器 arm (A M...原创 2019-04-02 10:23:48 · 1085 阅读 · 0 评论 -
常用汇编指令
1、数据传送指令 movmove r1,r2 /r1=r2/move r1,#4096 /r1=4096/2、伪指令ldr 用于将一个大于八位的数据装入寄存器ldr r1,=0x123456789 /r1=0x123456789/ldr r1,=label /获取绝对地址,即label的地址/label: ……3、内存访问指令(当ldr后面没有...原创 2019-12-18 18:58:24 · 2138 阅读 · 0 评论 -
C语言实现符号匹配
#include<stdio.h>int check(char str[]){ int flag=0; char stack[100];int top=-1;//初始化一个栈 for(int i=0;str[i]!='\0';i++){ if(str[i]=='('||str[i]=='{'||str[i]=='[') { stack[++top]=str[i]; ...原创 2019-10-15 21:58:04 · 995 阅读 · 0 评论 -
C语言break和continue的用法和区别
break 语句很重要,用得非常多,初学者一定要掌握。continue 语句虽然没有 break 语句用得多,但也经常用到,而且不可或缺,需要用到 continue 的时候其他语句是无法替代的。前面已经介绍过 break 语句,它不仅可以跳出“循环体”,还可以跳出 switch。但事实上,break 也只能用于这两种情况。break 语句不能用于循环语句和 switch 语句之外的任何其他语句中...原创 2019-08-02 12:55:57 · 960 阅读 · 0 评论 -
合并两个有序链表
#include <string.h>#include <stdio.h>#include <stdlib.h>typedef struct NODE{ int data; struct NODE *next;}ListNode;ListNode* LinkList_Create(int *data,int len){ int i; Li...原创 2019-07-27 22:57:53 · 340 阅读 · 0 评论 -
二进制数中1或0的个数
#include <string.h>#include <stdio.h>#include <stdlib.h>int numberof1(int num){ int count = 0; while(num) { num = num & (num - 1); count++; } return count;}...原创 2019-08-03 20:17:08 · 633 阅读 · 0 评论 -
双向链表
#include <string.h>#include <stdlib.h>#include <stdio.h>typedef struct NAME{ char *name; struct NAME *pre; struct NAME *next;}T_Name,*PT_Name;static PT_Name g_ptNameHead;...原创 2019-07-30 20:53:37 · 329 阅读 · 0 评论 -
链表反转
#include <stdlib.h>#include <string.h>#include <stdio.h>typedef struct _ListNode{ int data; struct _ListNode *next;}ListNode; ListNode* LinkList_Create(int *value,int len)...原创 2019-07-20 17:42:23 · 323 阅读 · 0 评论 -
字符设备驱动开发流程
字符驱动相关概念解析一、驱动初始化1.1分配设备描述结构1.2初始化设备描述结构1.3.注册设备描述结构1.4.硬件初始化二、实现设备操作2.1open2.2read2.3.write2.4.lseek2.5close2.6参数分析三、驱动注销字符驱动相关概念解析1设备描述结构在任何一种驱动模型,字符、网卡驱动等,设备都会用内核的一种结构来描述。我们的字符设备在内核...原创 2019-10-06 22:15:46 · 1287 阅读 · 0 评论 -
输出链表倒数第K个元素的节点值
#include <stdlib.h>#include <string.h>#include <stdio.h>typedef struct _ListNode{ int data; struct _ListNode *next;}ListNode; ListNode* LinkList_Create(int *value,int len)...原创 2019-07-20 17:24:34 · 497 阅读 · 0 评论 -
source insight 的一些快捷键,特殊功能,也想你所不知道的,转载
本文结合实例介绍如何使用SourceInsight提高开发的效率和规范。缩进与TAB1. Options菜单Document Options Editing Options框中,tab width= 4 Editing Options框中,勾选Expand tabs(这样,按tab键、等价于输入4个空格)在严格的编码规范中不可以使用Tab,要使用空格。这个是节省工作的符合编码规范的好方法。2...转载 2019-08-17 15:57:47 · 2091 阅读 · 0 评论 -
strcmp 和 strncmp的实现
int my_strcmp(const char *dest, const char *sour){ assert(dest); assert(sour); while (*dest == *sour) { if (*dest == '\0') return 0; dest++; sour++...原创 2019-09-18 19:52:36 · 450 阅读 · 0 评论 -
linux下应用程序调试
今天在写一个应用程序,在开发板上测试的时候,发生了段错误让程序在开发板上直接运行,当它发生错误时,令它产生core dump文件然后使用gdb根据core dump文件找到发生错误的地方在ARM板上:ulimit -c unlimited执行应用程序 : 程序出错时会在当前目录下生成名为core的文件在PC上:3. /bin/arm-linux-gdb ./test_debug...原创 2019-09-20 22:01:45 · 815 阅读 · 0 评论 -
两个线程,一个线程打印A,一个线程打印B,如何实现两个线程按顺序打印出ABABAB
方法一:信号量类似于生产者和消费者问题#include <stdlib.h>#include <pthread.h>#include <stdio.h>#include <semaphore.h>sem_t blank_number, product_number; void *producer(void *arg){ wh...原创 2019-10-06 17:50:32 · 1871 阅读 · 0 评论 -
TCP协议-如何保证传输可靠性
确保传输可靠性的方式TCP协议保证数据传输可靠性的方式主要有:**校验和****序列号****确认应答****超时重传****连接管理****流量控制****拥塞控制**校验和计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。发送方:在发送数据之前计算检验和,并进行校验和的填充。接...原创 2019-10-06 18:18:10 · 837 阅读 · 0 评论 -
bootloader启动内核过程
内核一般是由bootloader来引导的,通过bootloader启动内核一般要传递三个参数,第一个参数放在寄存器0中,一般都为0,r0 = 0;第二个参数放在寄存器1中,是机器类型id,r1 = Machine Type Number;第三个参数放在寄存器2中,是启动参数标记列表在ram中的起始基地址;bootloader首先要将ramdisk(如果有)和内核拷贝到ram当中,然后可以通...原创 2019-10-06 22:24:27 · 998 阅读 · 0 评论 -
快速排序
其实快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边,这样就找到了该数据在数组中的正确位置.#include<string.h>#include<stdio.h>#include<stdlib.h>void printArray(int array[],int len){ int i = 0; for(i=0;...原创 2019-10-07 14:02:10 · 321 阅读 · 0 评论 -
自定义一个函数,实现库函数strcpy和strncpy
char* my_strcpy(char* dest, const char * src){ assert(dest);//检测参数是否为空指针 assert(src);//检测参数是否为空指针 char *ret = dest; while ((*(dest++) = *(src++)) != '\0'); return ret;}...原创 2019-05-09 17:44:12 · 1365 阅读 · 0 评论 -
从尾到头打印链表节点值
#include <stdlib.h>#include <string.h>#include <stdio.h>typedef struct _ListNode{ int data; struct _ListNode *next;}ListNode; ListNode* LinkList_Create(int *value,int len){...原创 2019-07-20 15:32:59 · 342 阅读 · 0 评论 -
替换空格
#include <string.h>#include <stdlib.h>#include <stdio.h>void ReplaceBlank(char *input){int i;int count = 0;int len = strlen(input);for (i = 0; i < len; i++)if (input[i] =...原创 2019-07-20 12:52:56 · 309 阅读 · 0 评论 -
大端模式和小端模式
一、为什么会有大小端模式之分这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式...原创 2019-05-26 09:35:20 · 402 阅读 · 0 评论 -
请找出单向链表的数据元素值最大的结点
typedef struct _Node { int data; struct _Node * next; } Node; Node* SearchMax(Node* pHead)//pHead为头结点 { Node* p1; Node* p2; p1 = pHead->Next; p2 = p1->...原创 2019-05-15 17:41:09 · 1847 阅读 · 0 评论 -
已知一个单向链表的头指针pHead,请取出倒数第N个结点的数据
typedef struct node{ int data; struct Node * next; } NODE;//定义一个链表结点 NODE* Findlastth(NODE*head,int N) //找寻链表中倒数第N个节点{ int k=N; NODE*p,*q; p=q=head->next;...原创 2019-05-15 17:34:08 · 620 阅读 · 0 评论 -
C语言实现插入排序
#include <string.h>#include <stdio.h>int instersort(int *s,int n){ int temp = 0,i = 0,j = 0,k=0; for(i=1;i<n;i++) { k = i; temp = s[i]; for(j = i-1;(j >= 0...原创 2019-05-09 20:07:24 · 721 阅读 · 0 评论 -
自定义一个函数,实现库函数strlen
int my_strlen(const char *str){ assert(str); int count = 0; while(*(str++) != '\0') { count++; } return count;}原创 2019-05-09 17:45:26 · 594 阅读 · 0 评论 -
自定义一个函数,实现库函数memcpy的全部功能
void *memcpy(void *dest,const void *src,size_t count){ assert(dest != NULL && src != NULL); char*tmp = dest; constchar*s = src;while(count--){ *tmp++ = *s++ ;} return dest...原创 2019-04-28 22:23:32 · 505 阅读 · 0 评论 -
自定义一个函数,实现库函数strcat的全部功能
char * my_strcat(char * str1, const char *str2){ assert(str1&&str2);//检测参数是否为空指针 char * ret = str1; while (*(str1++) != '\0'); while (*str2 != '\0') { *(str...原创 2019-04-27 23:05:53 · 1302 阅读 · 0 评论 -
字符串初始化赋值
在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。(1)直接逐个初始化字符数组:字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ ‘I’,’ ‘,‘a’,‘m’,’ ‘,‘h’,‘a’,‘p’,‘p’,‘y’};注意:如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这...原创 2019-04-27 17:45:17 · 17229 阅读 · 0 评论 -
自定义一个函数,实现库函数strstr的全部功能
/**********定位出src在dest字符串中的位置,若不存在就返回NULL*******/char *my_strstr(const char *dest, const char *src){ assert(dest && src);//检测参数是否为空指针 char *p = NULL; char *q = NULL; ...原创 2019-04-27 13:48:06 · 471 阅读 · 0 评论 -
已知一个MCU的复位地址为0x00080000,请利用函数指针的方法实现复位
首先声明一个函数指针,指向复位后要开始执行指令的位置:void (*app_start)(void) = 0x00080000;、之后,在自己的程序中想复位的地方调用app_start();也就是跳到0x00080000位置执行指令。可以根据不同MCU复位的地址,修改上边的地址(0x00080000)。...原创 2019-05-26 21:26:22 · 951 阅读 · 0 评论 -
C语言实现选择排序
#include<stdio.h>#include<string.h>#include<stdlib.h>void printArray(int array[],int len){ int i = 0; for(i=0;i<len;i++) { printf("%d ",array[i]); } printf("\n");} ...原创 2019-05-17 16:21:20 · 1853 阅读 · 0 评论 -
C语言运算符优先级
初级运算符( )、[ ]、->、. 高于 单目运算符 高于 算数运算符(先乘除后加减) 高于 关系运算符 高于 逻辑运算符(不包括!) 高于 条件运算符 高于 赋值运算符 高于 逗号运算符。位运算符的优先级比较分散。除了赋值运算符、条件运算符、单目运算符三类的平级运算符之间的结合顺序是从右至左,其他都是从左至右。说明:同一优先级的运算符,运算次序由结合方向...原创 2019-05-27 13:12:02 · 430 阅读 · 0 评论 -
fork()函数的底层实现原理
在Linux中,fork函数是非常重要的函数,他从一个已存在的进程中创建一个新进程;新进程为子进程,而原进程称为父进程。接下来我们一起来系统的解析一下fork函数的调用原理:1、fork函数原型#includepid_t fork(void)返回值:pid_t 是进程描述符,实质就是一个int,如果fork函数调用失败,返回一个负数,调用成功则返回两个值:0和子进程ID。函数功能:以...原创 2019-07-19 17:41:56 · 3558 阅读 · 0 评论 -
进程和线程、多进程与多线程
进程和线程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.线程的出现是为了降低上下文切换的...原创 2019-07-19 15:59:23 · 474 阅读 · 0 评论 -
gdb调试工具常用命令
编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o maingdb中命令:回车键:重复上一命令(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r(gdb)start:单步执行,运行程序,停在第一执行语句(gdb)...原创 2019-07-19 15:29:09 · 434 阅读 · 0 评论