#include <stdio.h>
int get_rdtsc() ...{
return asm("rdtsc")
}
这个函数可以获得cpu的时间戳,分辨率当然是cpu的主频, 如果cpu频率高的话, 27MHz的定时误差应该不是很大。但是, 你要输出和处理这个时钟信号产生的延迟也不太好控制,毕竟不是实时系统。。。。
楼主的程序没有用 signal 注册 SIGPROC 对应函数,在 for 循环的时候可能已经发生了多次中断和重置计时器。至于比1秒大,手册中有解释 Timers will never expire before the requested time, but may expire some (short) time afterward, which depends on the system timer resolution and on the system loadsee time(7).
要在1秒间隔调用一个函数,需要加上 signal,比如
#include <signal.h>#include <sys/time.h>
#include <stdio.h>
#include <time.h>
static struct itimerval a
void timeover( int event )
{
struct itimerval b
printf( "timeover at %ld\n", time(NULL) )
getitimer( ITIMER_PROF, &b )
printf( "sec = %ld, usec = %ld\n", b.it_value.tv_sec, b.it_value.tv_usec )
}
int main()
{
signal( SIGPROF, timeover )
printf( "begin at %ld\n", time(NULL) )
a.it_interval.tv_sec = 1
a.it_interval.tv_usec = 0
a.it_value.tv_sec = 1
a.it_value.tv_usec = 0
setitimer( ITIMER_PROF, &a, NULL )
while(1)
return 0
}
开发板上电第一步是启动固件,固件是出厂时固化好的,固件的作用是初始化一下基本的 设备,以nand为例,固件irom初始化好sram后,将nand中的前4k的bootloader(一般为uboot)拷贝到sram中,sram再初始化另一些设备比如dram等等,然后运行剩下的bootloader,接下来就是引导linux内核的启动了。bios在开发板相当与irom部分功能和uboot的前4k,内存时钟会在uboot中初始化的。uboot先做一些准备(比如设svc模式,关看门狗、中断、mmu等),然后设置内核参数表,然后跳到内核的地址运行,内核一般是压缩的,需要先解压,入口是stext,是在arch/arm/kernel/vmlinux.lds.S中定义的欢迎分享,转载请注明来源:内存溢出
评论列表(0条)