![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
嵌入式Linux
文章平均质量分 71
可乐吧kaito
这个作者很懒,什么都没留下…
展开
-
一个父进程创建多个子进程,有些需…
在Linux下我们可以用fork函数创建一个子进程,但是当我们需要在一个父进程下创建多个子进程时,有些需要注意的地方。假设我们用如下代码在一个父进程下创建两个子进程:void main(){pid_t pid1, pid2;pid1 = fork();pid2 = fork();if(pid1 == 0){printf("This is the first child proces原创 2017-06-21 22:51:16 · 19033 阅读 · 0 评论 -
printf的学习
首先从网上找到了glibc的标准库的内容,找到了里面的printf.c的函数实现int__printf (const char *format, ...){ va_list arg; int done; va_start (arg, format); done = vfprintf (stdout, format,arg); va_end (arg); ret原创 2017-06-21 22:50:29 · 216 阅读 · 0 评论 -
Vsprintf简介--附实现源码
原文地址:Vsprintf简介--附实现源码作者:佳丽恐龙vsprintf #include char buffer[80]; int vspf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vsprintf(buffer, fmt,argpt转载 2017-06-21 22:50:24 · 5729 阅读 · 0 评论 -
并发式TCP服务器的设计
在之前的TCP服务器设计时,采用的是循环接收并处理客户机的请求的轮询方式,这样的效率太低,因为当多个客户机同时向服务器发出请求时,就会导致后面来的客户机一直停滞在那里,直到服务器处理完前一个客户机的请求之后才会处理下一个服务器的请求。所以一个较好的办法就是采用多进程来处理。利用主进程来接受客户机的请求,得到一个请求就创建一个子进程来处理数据,这样就可以在同一时刻处理多个客户机发来的请求。当然原创 2017-06-21 22:50:21 · 382 阅读 · 0 评论 -
linux网络通信-------UDP协议
UDP编程模型UDP协议是长度固定的,无连接的不可靠报文传递,所以不像TCP协议那样需要在发送数据之前先建立连接服务器创建socket socket绑定地址 bind接收数据 recvfrom发送数据 sendto结束连接 close客户机 创建socket socket发送数据 sendto接收数据原创 2017-06-21 22:50:18 · 267 阅读 · 0 评论 -
linux网络通信-----TCP协议
首先要了解TCP的通信原理在网络通信中,我们往往会用到不同的网络协议,有TCP,UDP,ICMP,IP,IGMP...为了我们使用网络通信方便,Linux采用socket(套接字)来连接不同协议的接口,就相当于是在中间加入了一个交换机,自动把不同的网络连起来一样。这样我们就可以在不同的网络协议中用相同的函数了。TCP编程模型TCP通信需要服务器和客户端双方进行通信首先服务器需要:创原创 2017-06-21 22:50:15 · 302 阅读 · 0 评论 -
ubuntu下,ARM_tools 的安装
http://www.linuxidc.com/Linux/2013-06/85902.htm原创 2017-06-21 22:50:13 · 563 阅读 · 0 评论 -
linux多线程程序
这里是多线程,而不是多进程。我们用fork函数可以创建子进程,创建的子进程是和源程序完全一样的,但是有自己的堆栈,代码段,数据段,BSS端,而且当源进程关闭的时候,创建的新进程不会关闭,就相当于是复制出完全一样的两个程序在运行。但是这里的线程就不一样了。它在源程序里创建了一个新线程,这个线程不是源程序的完全复制,它和源程序共用同个资源,是源程序为了提高效率让多个线程同时执行某一项操作。相原创 2017-06-21 22:50:10 · 158 阅读 · 0 评论 -
消息队列的范例代码
随机生成键值(不重复)用ftok发送端代码#include#include#include#includestruct msgt{ long msgtype; char text[1024];};void main(){ int key; int msqid; int k; struct msgt mymsg;原创 2017-06-21 22:50:07 · 879 阅读 · 0 评论 -
linux进程间通信-------消息队列
消息队列属于IPC两个进程间要通过消息队列进行通信,比如A通过消息队列给B传送一个消息。首先A要建立一个消息队列,然后A往该消息队列里面发送消息(由一个有特殊形式的结构体构成,包括数据类型和数据内容),当不需要使用这个消息队列的时候删除消息队列。B要做的事情是打开消息队列,打开方式是用和A里面一样的键值打开对应的消息队列,然后接收消息队列的消息(即结构体中某个类型的数据),结束。相关函数原创 2017-06-21 22:50:05 · 204 阅读 · 0 评论 -
linux进程间通信-------共享内存
Linux系统中的两个进程可以通过共享内存的方式来进行通信,属于IPC通信,也就意味着和键值有关。。。首先通过某个进程创建一片共享内存,创建的这片共享内存会返回一个描述符,这样其它的进程也可以使用这片内存。要使用共享内存的进程都必须先把那片内存映射到要调用的进程里,这里可以自己创建一个结构,用这个结构的指针来指向这片地址。用完共享内存后,要把共享内存和进程分离,最后分离的进程还要把这块共原创 2017-06-21 22:50:02 · 199 阅读 · 0 评论 -
OK6410ping通Linux虚拟机
笔记本和OK6410直连,或者通过交换机连接虚拟机选择桥接模式,以保证Windows和虚拟机在同一网段关闭所有防火墙设置OK6410的IP和Windows,Linux都在同一网段,否则ping不通Ctrl+shift+T 在Linux终端快速创建一个相同位置的终端原创 2017-06-21 22:49:59 · 204 阅读 · 0 评论 -
创建文件&复制文件&删除文件
#include#include#include#include#include#includechar buf[60];int count;void main(int argc, char *argv[]){ int a = argc; int fd, fd1, fd2; int flag; char ch; printf(原创 2017-06-21 22:49:57 · 256 阅读 · 0 评论 -
给linux添加PATH环境变量
今天在/home/kaito/kaito/kkk目录下谢了一个kaito.c编译出来的kaito可执行文件为了使这个课执行文件在任何目录下都可以使用,就像使ls那样,我需要添加环境变量首先到/etc/目录下打开profile编辑vim /etc/profile在这个文本的最后添加一行和原来最后一行结构一样的,但是那个文件路径改成我们放kaito可执行文件的路径我的就是/home/kai原创 2017-06-21 22:50:32 · 238 阅读 · 0 评论 -
Linux init详解 (0,1,2,3,4,…
原文地址:init详解 (0,1,2,3,4,5,6)">Linux init详解 (0,1,2,3,4,5,6)作者:海木棉枫init是Linux系统操作中不可缺少的程序之一。 所谓的init进程,它是一个由内核启动的用户级进程。 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所转载 2017-06-21 22:50:34 · 224 阅读 · 0 评论 -
FIFO和线程的使用
做一个类似聊天的工具第一个程序的代码#include#include#include#include#include#include#include#includeint res, r_fd, s_fd;pthread_t th_r, th_w;int kflag = 0;void *thread_w(){int tmp;char p[1000];while原创 2017-06-21 22:51:13 · 903 阅读 · 0 评论 -
linuxFIFO(有名管道)
FIFO(first in first out)最先被写入文件的字节总是最先被读出。FIFO在文件系统中不拥有磁盘块,打开的FIFO文件时一个与内核缓冲区相关的区域,用来存放两个进程之间交换的数据。且FIFO的文件名包含在系统的,目录树当中,因此任何进程都可以访问这个FIFO文件。FIFO(有名管道)可以用于任意两个进程之间的数据交换,而且管道的读端和写端也以文件的方式给出(只不过这个文原创 2017-06-21 22:51:10 · 447 阅读 · 0 评论 -
linux管道(无名管道)
首先管道是进程之间的一个单向数据流,它的数据流向由内核管理,只能从一个进程流向另外一个进程,一个进程向管道写入数据,另外一个进程从这个管道读取数据。在使用管道(无名管道)时,只能用在父子进程或者亲属进程之间,若要用在任意进程之间则需要使用FIFO(有名管道)如图进程AB通过管道进行数据交换。进程A通过管道的“写端”往管道里面写入数据,进程B通过“读端”从管道里面读取数据。而在系统调用原创 2017-06-21 22:51:07 · 284 阅读 · 0 评论 -
linux进程通信第一次回顾
进程通信,是说进程之间同步和交换数据。虽然通过文件加锁可以实现同步,但是代价很高因为它需要访问磁盘文件系统。Unix系统提供的进程间通信的基本机制:1.管道。管道又分为无名管道和有名管道,有时直接把无名管道简称为管道,把有名管道说成是FIFO。2.信号量。3.消息。4.共享内存区。允许进程通过共享内存块来交换信息。在共享大量数据时是效率最高的。5.套接字(socket)。允许不同计算原创 2017-06-21 22:51:04 · 203 阅读 · 0 评论 -
s3c6410的MMU使用(用段的方式转化…
1.mmu的介绍mmu,即Memory ManagementUnit,内存管理单元。在处理器中,放在cpu和内存之间,有两个作用(1)转换虚拟内存(2)设置程序对内存的访问(在裸机阶段,对于处在不同域domain的虚拟地址,可设置不同的权限)2.s3c6410中的mmu在6410中,mmu的虚拟地址到物理地址的转化如图,可采用3种方式按照虚拟地址的[31:20]位的最后两位,当为原创 2017-06-21 22:51:01 · 427 阅读 · 0 评论 -
Ubuntu下用dnw下载到OK6410开发板
https://github.com/Qunero/dnw4linux就是这篇,里面的源码可以用,就是他给的先删掉,自己重新编译出dnw和secbulk.ko,才可以用。弄了我好久,蓝过原创 2017-06-21 22:50:59 · 257 阅读 · 0 评论 -
关于Linux重定向输入输出
Linux默认的标准输入来自于键盘,标准输出输出到屏幕上但是通过重定向,我们可以修改对于一个shell命令的输入输出(即不是从键盘输入,或不是从屏幕输出)但是要注意的是,对于输入输出都必须是字符流,而不能是其他像路径这样的东西先做重定向输出,比如我们要输出到一个文件里面,用 > 然后是重定向输出,用 我先写了一个path.txt,内容如下然后用ls 结果显示的却是当前原创 2017-06-21 22:50:56 · 378 阅读 · 0 评论 -
这是关于Makefile的基础学习
http://pan.baidu.com/s/1bo6sx91原创 2017-06-21 22:50:53 · 166 阅读 · 0 评论 -
Ubuntu下挂载和卸载U盘
当我们在Ubuntu下插入U盘时,会出现还好这是U盘,系统会自动帮我们做好工作。但如果是一个系统不能处理的存储设备,或是设备,那就需要我们自己挂载和卸载,这里用U盘来操作先用fdisk -l查看存储设备其中显示设备文件/dev/sdb1,设备类型为nfts当我们这是去挂载U盘时mount -t ntfs /dev/sdb1 /media/udisk显示挂载被拒绝,因为这个原创 2017-06-21 22:50:51 · 555 阅读 · 0 评论 -
./build: line 53:&nbsp…
1.编译QT4.4.3的时候,出现如下问题:Bootstrap QBuild: .. FAILIn file included from../../../qt-extended-4.4.3/qbuild/src/main.cpp:37:../../../qt-extended-4.4.3/qbuild/src/options.h: In constructor'Options::Opt原创 2017-06-21 22:50:48 · 313 阅读 · 0 评论 -
review makefile
今天重新复习了makefile关于makefile,就是一系列规则,用来规定对文件编译,连接,汇编的规则先说一下,在gcc后面-o表示对生成的文件取另外一个名字-c表示编译不连接-C表示进入一个目录首先,在一个文件夹下创建一个main.c函数实现为#include "kaito.h"void main(){ printf("This is the main原创 2017-06-21 22:50:39 · 175 阅读 · 0 评论 -
linux 下 /bin /sbin 的区别
原文地址:下 /bin /sbin 的区别">linux 下 /bin /sbin 的区别作者:Blossom/bin,/sbin,/usr/bin,/usr/sbin区别/ : this is root directory root 用户根目录/bin : commandsin this dir are all system installed user c转载 2017-06-21 22:50:37 · 190 阅读 · 0 评论 -
信号量同步编程
利用信号量不仅可以是两个进程对一个文件访问互斥,还可以对进程进行同步。这里虽然说是同步,但我觉得更像是让进程按照一定的顺序访问一个文件,即给进程排个序来操作文件#include#include#include#include#include#include#includevoid main(){ int fd; int semid; struct原创 2017-06-21 22:49:54 · 185 阅读 · 0 评论 -
通过信号量达到进程对资源占用的互…
信号量与IPC(管道,FIFO,消息队列)不同,它是一个计数器,用于多进程对共享数据对象的访问。不过信号量到底是一个什么东西呢?简单来说它就是一个标志,实质是一个数字,用来标记占用资源的进程个数。对于一些特殊的资源,我们可以利用信号量来限制进程对文件资源的访问,举个例子进程A要对文件F进行操作,但是进程A的动作很慢,在A还没做完时B进程来了,它也要对F操作,这时文件F就会因为AB两个进程同原创 2017-06-21 22:49:51 · 283 阅读 · 0 评论 -
main函数的两个参数使用
main函数可以带两个参数,第一个参数是int型的 intargc,第二个参数是指向字符串的指针数组(即该数组里面的每一个元素都指向一个字符串的首地址) char*argv[]void main(int argc, char*argv[])当我们编译好一个c语言程序后,在终端/cmd里面就可以给这个程序带上参数,即通过命令的形式把参数传给程序如写了一个显示参数的程序#in原创 2017-06-21 22:49:49 · 875 阅读 · 0 评论 -
对于一个工程的结构理解
这里只简单说说Linux下对ARM11的情况一般最基本的有三个部分 .c/.S .lds makefile这里面.c/.S是源文件,就是我们的想法写在这里面,不一定只有一个,可以有很多个int main(){#ifdef MMU_ON mmu_init();#endif led_init(); button_init(); ini原创 2017-06-21 22:49:05 · 309 阅读 · 0 评论 -
OK6410按键中断点亮lED
首先理清楚要准备的几个方面1.LED初始化2.按键初始化3.中断初始化4.中断处理程序首先初始化LED,以前说过了,不说按键初始化,这里既然要用到中断,就不用传统的延时消抖的办法了,直接用中断。只要把对应的位设置成10,就是外部中断了这里用XEINT0和XEINT5,有理由的,为什么选这两个后面会说void button_init(){*(GPNCON)=0x80原创 2017-06-21 22:49:02 · 380 阅读 · 0 评论 -
关于链接器脚本 & makefile
对.c文件进行编译不链接会产生.o文件,用生成elf可执行文件必须用链接器把一堆灰互相调用的.o文件链接起来这里就用到了链接器脚本固定格式OUTPUT_ARCH(arm)ENTRY(_start) (指明起始地址)SECTIONS {. = 0x50008000;(.表示当前地址,每次程序开始都要给当前地址赋值,在BL里面就可以,这里选择内存起始不久处0x50008000). =原创 2017-06-21 22:48:59 · 317 阅读 · 0 评论 -
【转】arm-linux-ld命令&nbs…
原文地址:ld链接脚本">【转】arm-linux-ld命令 ld链接脚本作者:御剑踏浪 我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来;其次,这些.o文件存在相互调用的关系;再者,我们最后生成的bin文件是要在硬件中运行的,每一部分放在什么地址都要有仔细的说明。我觉得在写makefile的时候,最为重要的就是转载 2017-06-21 22:48:57 · 239 阅读 · 0 评论 -
ARM汇编,MCR和MRC
原文地址:ARM汇编,MCR和MRC作者:linux_deliver_loveMRC 传送一个协处理器寄存器到一个 ARM 寄存器, MCR 做反方向传送(字母看起来象是写反了,记住在 ARM汇编器中目的通常写在左边)。 MCR 传送 ARM 寄存器 Rd 的内容到协处理器。协处理器基于 ooo、dddd、qqq 和MMMM 字段的值自由的做它想做的任何事情,尽管有一个“标准的”解释: 把它写转载 2017-06-21 22:48:54 · 433 阅读 · 0 评论 -
内存初始化
嗨,今天看内存初始化的内容,快看哭了T_T,问老师,老师不怎么回答,还是看一篇博文知道了不少回头又增加了不少关于内存地知识。在我们的开发板里面都有地址空间,不同的地址空间区域对应着不同的功能,其中主存储区中有一部分(动态存储区)就是内存的地址(0x50000000)。在OK6410里使用的是属于DRAM的DDR对于内存的初始化,在芯片手册里有规定好的步骤,但是要实现起来却不太简单,它里面原创 2017-06-21 22:48:50 · 531 阅读 · 0 评论 -
初始化s3c6410时钟
关于时钟体系,以前其实我还真不清楚,或者说是没有注意到。上了今天的课后知识注意到了几点,以后要注意到的1晶振频率 2PLL 3PLL产生了多少时钟 4这些产生的时钟都拿去干嘛我们采用的外部晶振频率都不够,不够CPU工作,所以可以用PLL锁相环来提高频率。在6410里面有APLL,MPLL,EPLL,其中APLL能产生ARMCLK供核使用的时钟;MPLL能产生HCLK(AXI/AHB总线用原创 2017-06-21 22:48:48 · 258 阅读 · 0 评论 -
ARM汇编语言常用指令
上次说到汇编语言十分重要,所以又为了避免忘记,贴上一些常用汇编指令@mov 指令范例mov r1, #8mov r2, r1mov r3, #10@mvn 传送取反赋值mvn r1, #0b10mvn r2, #5mvn r3, r1@sub 减法 目的寄存器 被减数(不能是立即数) 减数mov r2,#4sub r1,r2,#2mov r0,#1sub r3,原创 2017-06-21 22:48:43 · 1069 阅读 · 0 评论 -
在OK6410上点亮指路明灯(LED)
说实话,对于专业人事,这可能是十分简单的东西,但是还是记录一下,免得回头又忘了,毕竟看视频还是挺麻烦的。这是开发板底板的原理图,所以只要把对应的管脚变成低电平就可以了所以这就是最简单的GPIO,其实我觉得这里面的这个和K60里的那个十分相似,GPIO既有IO输入输出功能,也有外部中断功能,甚至更多。(毕竟cortexM系列的只适用于工控)所以附上GPIO的管脚图和寄存器所以配置G原创 2017-06-21 22:48:40 · 216 阅读 · 0 评论 -
bootloader的核心初始化forARM11
今天刚学习完bootloader的核心初始化,趁早记下,免得忘记关于ARM11的bootloader核心初始化,通过对u-boot的分析,主要有以下6步1设置异常向量表2设置CPU到svc模式3关闭看门狗4关闭所有中断5关闭mmu和cache6外设基地址初始化(这里先不讨论)明确目标之后就可以开始了,先构造脚本文件OUTPUT_ARCH(arm)ENTRY(_start)原创 2017-06-21 22:48:37 · 279 阅读 · 0 评论