embedded linux tips

|--------------|
|    dd        |
|--------------|
用途:做disk image,或者mbr。

用法举例:
dd if=/dev/fd0 of=disk.img bs=1440k
if=file,输入文件名,缺省为标准输入。
of=file,输出文件名,缺省为标准输出。
bs=bytes,同时设置读写块的大小为bytes。


|-------------------------|
|    嵌入式linux特性      |
|-------------------------|
常规linux在实时性上的缺陷:
  1.linux使用时间片来调度CPU时间;
  2.linux计时器的精度不够;
  3.大部分的Linux的核心进程是不能中断;
  4.linux支持虚拟内存用于分页机制;
  5.中断切换采取关中断的方式来对临界区处理,很慢;
这些表现在:
  1.中断延迟;(2.4的内核是不可抢占的,中断的优先级是最高的,也就是说你必须等待上一个处理结束,这样对realtime process是不能容忍的,2.6是可以抢占的,但还是有太多的preempt-disable的地方)
  2.进程上下文切换慢;
  3.spinlock不可抢占,直接空等,这样导致等待时间加长(in Timesys linux,spinlock is replaced by mutex which can be preeempted)。
4.各种lock机制不爽,比如说rwlock,rcu,big kernel lock(hold too long time),brlock(big read lock)...都有各种限制和缺陷。
5.memory barrier.
  6, virtual memory reduce the performance(due to page default).
  7,close interrupt is a big performance cost.(In RTLinux,it use soft measure to handle closing interrupt)

实时改进:
  1.去掉虚拟内存机制;  (vxworks)
  2.内核可抢占;(inside 2.6 kernel)
  3.单块内核,减少ring0/3切换开销;(vxworks)

rtlinux解决方案:(自己修改kernel)
  通过一个vm来替换linux的底层中断程序,real kernel与linux kernel共享控制cpu.
  设计更好的可抢占的任务调度器;
  改进时钟;

timesys linux:
将中断(irq & softirq)线程化(interrupts as threads,Solaris,SunOS5.0也是如此处理),并赋予一定的priority,realtime task have high level priority than irq.
not need to close irq.
  resource reservation mechanism.



|------------------|
|    mtd技术       |
|------------------|
使用flash保存数据需要两步:
1.flash disk设备:
/dev/mtd0-/dev/mtd16(偶数,9个char device来驱动flash)
2.文件系统:(0,1,2,7四个block device)
/dev/mtdblock1对应/,flash
/dev/mtdblock7对应/etc/config,nvram

过程如下:
mknod mtd0 c 90 0
mknod mtdblock0 b 44 0
ftl_format /dev/mtd0
mkfs /dev/mtdblock0
insmod xx
insmod yy



|-----------------------------------|
|    linux驱动demo                  |
|-----------------------------------|
#define XXmajorID 60
#define BASEADDR  0x7E000000
#define LEN       0x8000

unsigned short *pbase;

module_init(xx_init);
module_exit(xx_cleanup);

struct file_operations xx_fops = {
    ioctl: xx_ioctl,
    open: xx_open,
    release: xx_release,
};

static int __init xx_init(void)
{
    register_chrdev(XXmajorID, "xxdev", &xx_fops);
    pbase = ioremap(BASEADDR, LEN); //设备的io空间 
}

static void __exit xx_cleanup(void)
{
    unregister_chrdev(XXmajorID, "xxdev");
    iounmap(pbase);
}

int xx_ioctl (struct inode *inode, struct file *filp,
                 unsigned int cmd, unsigned long arg)
{
    //cmd是IOCTL码
    //arg是个unsigned char *地址;
    copy_from_user(...); //从app读取内存到kernel
    copy_to_user(..);    //kernel传数据给app
    return 0;
}

int xx_open (struct inode *inode, struct file *filp)
{return 0;}

int xx_release(struct inode *inode, struct file *filp)
{return 0;}

编译Makefile:
CC=gcc
LD=ld
CFLAGS=
DFLAGS=-DMODULE -D__KERNEL__ -DLINUX -Wall -O2

xx.o:xx.c
 $(CC) %(CFLAGS) $(DFLAGS) -c $< -o $@

后话:
可将module加入到kernel编译中,编写config.in,加入对我们module driver的信息支持,加入一个定义宏;然后make menuconfig选中刚才我们定义的宏;然后在drivers下的Makefile加入对我们编译后的驱动程序目标文件的支持;然后在/drivers/char/mem.c文件chr_dev_init函数中,加入对我们driver的初始化函数调用;然后在文件系统中mknode即可. 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值