linux世界里的时间 通常,操作系统可以使用三种方法来表示系统的当前时间与日期:①最简单的一种方法就是直接用一个64位的计数器来对时钟滴答进行计数。②第二种方法就是用一个32位计数器来对秒进行计数,同时还用一个32位的辅助计数器对时钟滴答计数,之子累积到一秒为止。因为232超过136年,因此这种方法直至22世纪都可以让系统工作得很好。③第三种方法也是按时钟滴答进行计数,但是是相对于系统启动以来的滴答次数,而
sprintf函数的用法 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。sprintf 是个变参
error: unknown field ‘ioctl’ specified in initializer 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序就根本不需要查询设备的状态,这一点非常类似于硬件上的“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上一个进程接收到一个信号与处理器接收到一个中断请求是
“asm/semaphore.h: No such file or directory” 今天编译发现一个error: “asm/semaphore.h: No such file or directory” ,发现2.6.19和2.6.31对这个信号量声明并不相同[patch] include linux/semaphore.h for kernel 2.6.2
linux驱动学习笔记(2.3) scull模块 init_MUTEX被废除 一、今天在编译ldd3上的scullc的时候,出现如下错误:刚开始我以为没有包含头文件,然后我就去查2.6.39.1的源代码,结果在所有的符号中都没有发现init_MUTEX,后面在网站上发现了init_MUTEX的定义,如下所示:源码衔接:http://lx
memset函数详解 memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清
ARM的三种中断调试方法介绍 1 嵌入式软件开发流程 参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。 在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET select函数: 系统提供select函数来实现多路复用输入/输出模型。原型: #include sys/time.h> #include unistd.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描
arm cpsr的c x s f 位 msr cpsr_cxsf,r1 ;这里的cxsf表示从低到高分别占用的4个8bit的数据域指令中有时还有出现cpsr_cf, cpsr_all, cpsr_c等,这里: c 指 CPSR中的control field ( PSR[7:0]) f 指 flag field (PSR[31:24]) x 指 extend field (PSR[15:8]) s 指 st
bootloader与linux中位置无关代码的分析理解 首先,需要理解加载域与运行域的概念。加载域是代码存放的地址,运行域是代码运行时的地址。为什么会产生这2个概念?这2个概念的实质意义又是什么呢?在一些场合,一些代码并不在储存这部分代码的地址上执行地址,比如说,放在norflash中的代码可能最终是放在RAM中运行,那么中norflash中的地址就是加载域,而在RAM中的地址就是运行域。在汇编代码中我们常常会看到一些跳转指令,比如说b、bl等,这些指令后面是一个相对地址而不是绝对地址,比如说b main,这个指令
C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用。在多个进程时.如果有时要检测上进程是否正常退出的.就要用到上个进程的返回值.. exit(1)表示进程正常退出. 返回 1; exit(0)表示进程非正常退出. 返回 0. 进程环境与进程控制(1): 进程的开始与终止
main函数的参数 C程序最大的特点就是所有的程序都是用函数来装配的。main()称之为主函数,是所有程序运行的入口。其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用时传递。main(){...y1=f1(x1,x2);...}f1(int a,int b){....Y2=f2(x3,x4);....
main函数的参数 C程序最大的特点就是所有的程序都是用函数来装配的。main()称之为主函数,是所有程序运行的入口。其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用时传递。main(){...y1=f1(x1,x2);...}f1(int a,int b){....Y2=f2(x3,x4);....
对于*(mmu_tbl_base)+virtuladdr>>20等的一点理解 如下:unsigned long *mmu_tlb_base = (unsigned long *)0x30000000; 如果执行mmu_tlb_base=mmu_tlb_base+1,会得到mmu_tlb_base为0x30000004的结果,对于指针的加减操作会将+1自动转换为+指针类型字节数 (unsigned short *)mmu_tlb_base+1的结果是0x30000002 (unsigned long)mmu_tlb
堆栈的问题 SP指针 为什么将SP设为 4096 设定之后怎么运行?是从4096开始写然后再写4095还是往4097写?4096是steppingstone的地址吗?中断为什么设为3072? S3C2410、S3C2440有内部RAM、外部的SDRAM,这些都被称为内存;SP设在内存上,可以是内部RAM,也可以是SDRAM,只要不破坏当前运行的程序就可以了。启动时首先执行内部RAM的4096,然后将NAND的代码移到SD
关于ARM9协处理器CP15及MCR和MRC指令 在基于ARM的嵌入式应用系统中,存储系统通常是通过系统控制协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。访问CP15寄存器的指令MCR ARM寄存器到协处理器寄存器的数据传送MRC 协处理器寄存器到ARM寄存器的数据传送MCR指令和MRC指令只能在处理器模式为系统模式时执行,在用户模式下执行MCR指令和MRC指令将会触发未定义指令的异常中断。MCR指令MCR指令将ARM处理器
深入理解SP、LR和PC 深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。1、堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。2、连接寄存器r14(LR):每种模式下r14都有自身版组,它有两个特殊功能。
为什么adrl r2,mem_cfg_val这里不用ldr r2,=mem_cfg_val, 请教书中sdram裸机代码memsetup:mov r1, #MEM_CTL_BASEadrl r2,mem_cfg_valadd r3, r1,#521:ldr r4, [r2],#4str r4, [r1],#4cmp r1,r3bne 1bmov pc,lrmem_cfg_val: .long 0x22011110 .long 0x000