原创 uclinux添加用户应用程序

2009-12-28 16:25 3408 8 8 分类: MCU/ 嵌入式
uclinux添加用户应用程序
by panasonic.lin@163.com


在上一节日志mini uclinux系统中,已经搭建好了开发环境,在主机上提供nfs和tftp服务,开发板通过网络下载uclinux映像和根文件系统,可以快速的进行应用程序以及驱动的开发。这里添加一个hello world的简单例程,主要了解uclinux中如何添加用户应用程序到文件系统的流程。

1.0在uClinux-dist20050311/user/建立app目录,再在app目录下建立hello.c:
/*------------------------------------------------*/
/*-------------hello.c---------------------------*/
/*------------------------------------------------*/
#include<stdio.h>
int main(void)
{

printf("Hello World!\n");
return 1;

}

2.0第一种方法,针对根文件系统是nfs的,这个最简单,只需交叉编译hello生成flat格式的二进制程序,拷贝主机的nfs根文件系统目录下,你甚至不用重新启动你的板子!在板子端执行hello就可以了。
进入app所在目录,$arm-elf-gcc -o hello hello.c -elf2flt,复杂一点的需要Makefile。

点击看大图

3.0第二种方法比较正规,步骤也多几步:
    3.1在app目录下建立Makefile如下
    /*------------------------------------------------*/
    /*-------------Makefile--------------------------*/
    /*------------------------------------------------*/
    EXEC = hello
    OBJS = hello.o
    all: $(EXEC)
    $(EXEC): $(OBJS)
        $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
    romfs:
        $(ROMFSINST)   /bin/$(EXEC)
    clean:
        rm -f $(EXEC) *.elf *.gdb *.o
   
    3.2在./config/config.in增加菜单配置选项
    ########################################################################
    mainmenu_option next_comment
    comment 'User Application'
    bool 'Hello' CONFIG_USER_HELLO
    comment "User Application"
    endmenu
    ########################################################################
   
    3.3在./config/config.help增加帮助或者说是描述文本
    CONFIG_USER_HELLO
      This program print hello on screen.
    3.4修改../user/Makefile增加
    dir_$(CONFIG_USER_HELLO) += app
   
    3.5编译
    $make distclean or make clean
    $make menuconfig or make xconfig
    在Kernel/Library/Defaults selection->customize vendor/user setting
    然后exit->do you wish to save your new kernel configuration->yes
    点击看大图

点击看大图

最后$make dep
        $make lib_only
        $make user_only
        $make romfs
        $make image
        $make
这样,romfs.img或者已经和内核连接的uclinux_rom.bin已经有了hello的应用程序了。

点击看大图

4.0第三种方法,只更新文件系统,生成新的文件系统映像
    4.1编译生成flat格式的可执行文件,直接输入$arm-elf-gcc -o hello hello.c -elf2flt
    4.2复制可执行文件到文件系统,前提是你有一个文件系统的目录,或者已经在uclinux根目录下执行了
        make romfs的命令,这样可以复制到romfs下面的/bin目录,但是执行了make clean命令后
        romfs目录的内容全部被删除了。
    4.3 执行$genromfs -v -V "Romdisk" -f romfs.img -d /uClinux-dist/romfs生成romfs.img
        可以烧写到flash,重新运行uclinux。


/*------------------------------------------------*/
/*-------------实验uclinux下点灯--------------------*/
/*------------------------------------------------*/
uclinux下由于不用MMU进行物理到虚拟地址的转换,可以直接访问实际的物理地址空间,应此某些硬件的寄存器可以直接访问到。
按照上面介绍的添加用户应用程序的方法,这里选用第一种方法,nfs的根文件系统,编译led应用程序后,直接拷贝到nfs-root,然后执行。

点击看大图

5.0随便那个目录建立led.c如下
/*******************************************************
 * File Name:     led.c
 * Description: led's blink
 * Author:panasonic.lin@163.com
 * Date:2009-12-29
 *******************************************************/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
/*define port configuration register and port data register address*/
#define PCONC (*(volatile unsigned *)0x01D20010)
#define PDATC (*(volatile unsigned *)0x01D20014)

/*LED0<->GPC1=bit[3:2] not used*/
/*LED1<->GPC2=bit[5:4] had used in uClinux-dist20050311/linux-2.4.x/arch/armnommu/mach-S3C44B0X/leds.c*/
/*LED2<->GPC3=bit[7:6] had used in uClinux-dist20050311/linux-2.4.x/arch/armnommu/mach-S3C44B0X/leds.c*/
#define LED0_CON (0x01<<2)
#define LED1_CON (0x01<<4)
#define LED2_CON (0x01<<6)

#define LED0_DAT (0X1<<1)
#define LED1_DAT (0X1<<2)
#define LED2_DAT (0X1<<3)

int i=0;
static void sig_alarm(int signumber)
{
  if(i==0)
  {
      PDATC |= LED0_DAT;//LED0=1
       i=1;
  }
  else
  {
      PDATC &=~(LED0_DAT);//LED0=0
       i=0;
  }
  alarm(2);
}


int main(void)
{
  PCONC =(PCONC&(~(0XC)))|LED0_CON;//change led0,not change led1 and led2!
  if(signal(SIGALRM,sig_alarm)==SIG_ERR)
  {
      printf("some error occurs\n");
      return 1;
  }
  alarm(2);
  while(1);
  return 0;
}
在uClinux-dist20050311/linux-2.4.x/arch/armnommu/mach-S3C44B0X/leds.c中,LED2用作指示CPU的busy,LED1用作指示timer中断。

5.1编译
$arm-elf-gcc –Wall –O2 -Wl,-elf2flt –o led led.c

5.2拷贝生成的led到nfs文件系统根目录下的bin,cd bin,./led







文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条