tag 标签: 松江嵌入式培训

相关博文
  • 热度 25
    2012-6-18 22:02
    1743 次阅读|
    1 个评论
     作者:征途中的人(转载,请注明作者,请尊重原创)   一、一位数组的初始化 1、在定义数组时对数组元素赋予初值 int a ={1,2,3}; 2、只给部分元素赋值 Int a ={1,2}; 3、在对数组全部元素赋初值,由于数组个数已经确定,因此可以不指定数组长度 int a ={1,2,3}; 或 int a ={0,0,0}; 或 Int a ={0};   二、字符数组的一般初始化 1、最容易理解的方式是在定义时候,逐个字符赋给数组中的各个元素,进行初始化 Char c ={‘a’,’b’,’c’}; 2、如果对在定义字符数组不初始化,则数组中各个元素的值是不可预料的。 字符个数大于数组长度则按语法错误处理。 Char c ={‘a’,’b’,’c’}; 字符个数小于数组长度则其余元素自动定为空字符。Char c ={‘a’,’b’,’c’}; 如下图:   C C C C a b c \0           3、如果字符个数与数组长度相同,在定义时可以省去数组长度,系统会自动根据数组字符个数确定数组长度。 Char c ={‘a’,’b’,’c’};  //长度为3 三、对字符串常量的一些认识 编译系统对字符串常量会自动加个’\0’作为结束标志。   用过以下语句输出一个字符串。 Printf(“how do you do?\n”);   在执行此语句时系统怎么知道应该输出哪里为止呢? 实际上,在内存中存放时,系统自动在最后一个字符’\n’的后面加个’\0’作为字符串结束标志。在执行printf函数时,每输出一个字符检查一次,看一个字符是否’\0’,遇到’\0’就停止输出。   四、用字符串常量使字符数组初始化 1、在定义字符数组的时候用字符串进行初始化 Char c ={“abc”}   需要说明的是:字符数组并不要求它的最后一个字符为’\0’,甚至可以不包含’\0’,像一下的写法是合法的 Char c ={“abc”}; 或 Char c ={‘a’,’b’,’c’};   是否要加’\0’,完全根据需要决定,但是由于系统对字符串常量自动加’\0’,因此为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作为相应的处理。在字符处理上也会人为的加上一个’\0’.例如: Char c ={‘a’,’b’,’c’,’\0’}; 这样便于引用字符数组中的字符串。     char c ={“hello”}; 和char c ={“hello”};有什么区别呢 在字符串存储中最后都会自动加个一个结束符’\0’.所以存储5个字符需要6个空间。 所以char c ={“hello”};缺少结束符,但是调用c ,c ,c ,c ,c ,是可以使用的,但是使用strlen(c),strcpy()等函数就会出现错误,因为找不到结束标志。   char c ={“hello”};可以正常使用,因为有结束标志’\0’,c =’\0’;   2、可以部分赋值 Char c ={“abc”}; 前三个元素为a,b,c,第四个元素为’\0’,后两个元素为空字符   a b c \0 \0 \0   3、可以省略数组长度 Char c =”abc”  //数组长度为4 等价于 Char c ={‘a’,’b’,’c’};     【上海索漫科技】提供  
  • 热度 23
    2012-6-6 22:55
    1602 次阅读|
    0 个评论
    以设置timer0的中断IRQ为例: VICIntSelect =0x00;中断选择寄存器 VICVectCntl0=0x24;向量控制寄存器 VICVectAddr0=(Uint32)IRQ_Timer0;向量地址寄存器 VICIntEnable=0x00000010;中断使能寄存器   1、VICIntSelect   中断选择寄存器     中断选择寄存器总共有22个有效位,每个位代表一个中断源。 中断选择寄存器的中断源位号来至于中断源的编号,一个位号对应一个中断源编号。 每个位有两种状态,0和1,分别代表IRQ和FIRQ。 总结:一个16进制的位代表四个二进制的位 赋值: VICIntSelect=0x00000000;IRQ VICIntSelect=0xFFFFFFFF;FIRQ   2、VICVectCntl0 向量控制寄存器     向量控制寄存器,有6个有效位,0-4位代表中断源标号(可以代表0-31个数,实际中断源编号是0-21),5位代表 当是1时,IRQ使能,当是0时,FIRQ使能。   赋值方式:两种 宏定义:VICVectCntl0 = (第5位使能+中断源编号)= 二进制(15)(0-21)十进制=得出十六进制0x2x(x代表中断源编号) 直接赋值:VICVectCntl0 =0x24; 3、VICVectAddr0 向量地址寄存器           向量控制寄存器和向量地址寄存器是一对。   4、VICIntEnable 中断使能寄存器         中断使能寄存器,总共有22个位,每个位代表一个中断源。 中断使能寄存器位号来至于中断源的编号,每个位号对应一个中断源编号。 每个位有0和1两种状态,分别代表FIRQ使能和IRQ使能。   赋值:有两种方式   通过宏定义方式:VICIntEnble =(14);4为中断位号(或中断源编号) 直接赋值方式:VICIntEnable = 0x0000 0001; 总结:中断选择寄存器VICIntSelect 和中断使能寄存器VICIntEnable 赋值方式相同。            
  • 热度 28
    2012-4-4 12:12
    2492 次阅读|
    0 个评论
      作者:下家山 (转载,请注明作者,请尊重原创) 一:printk等级 Printk是一个带打印等级(loglevel)的内核打印语句。 Linux内核根据问题的严重程度定义了八种等级(loglevel) #define    KERN_EMERG     "0"     /* system is unusable                   */ #define    KERN_ALERT      "1"     /* action must be taken immediately     */ #define    KERN_CRIT  "2"     /* critical conditions                    */ #define    KERN_ERR   "3"     /* error conditions                */ #define    KERN_WARNING "4"     /* warning conditions                  */ #define    KERN_NOTICE    "5"     /* normal but significant condition       */ #define    KERN_INFO  "6"     /* informational                   */ #define    KERN_DEBUG     "7"     /* debug-level messages               */ 值越小等级越高。 (见include/linux/kernel.h linux2.6.15) 二:printk输出方式 Printk的输出方式有两种:syslog(日志)和console(控制台)。我们通常在调试驱动时一般 把控制台定向到了串口,然后通过串口显示到串口终端上。 2.1 通过console输出        当loglevel小于console_loglevel时,消息才能被打印到控制台上(也就能在串口终端看到内容了)。      2.2 通过日志查看        那么当loglevel大于console_loglevel,消息保存在哪里呢? 如果系统运行了klogd和syslogd,则无论console_loglevel为何值,内核消息都将追加到/var/log/messages中。如果klogd没有运行,消息不会传递到用户空间,只能查看/proc/kmsg。 也就是说messages或kmsg中会显示所有的打印信息。 三:console_loglevel值为多少        Console_loglevel同样定义在include/linux/kernel.h中 #define console_loglevel (console_printk ) #define default_message_loglevel (console_printk ) #define minimum_console_loglevel (console_printk ) #define default_console_loglevel (console_printk )        而console_printk定义在哪里呢?        (见kernel/printk.c) #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */ /* We show everything that is MORE important than this.. */ #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */ #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */ int console_printk = {        DEFAULT_CONSOLE_LOGLEVEL,       /* console_loglevel */        DEFAULT_MESSAGE_LOGLEVEL,       /* default_message_loglevel */        MINIMUM_CONSOLE_LOGLEVEL,/* minimum_console_loglevel */        DEFAULT_CONSOLE_LOGLEVEL,       /* default_console_loglevel */ };        这样 console_loglevel值就为7 四:测试程序        #include #include #define       PRINTM_MSG(msg)   printk(KERN_DEBUG msg) #define       PRINTM(level,msg...) PRINTM_##level(msg) #define pr_debug(arg) printk(KERN_INFO arg) static int printk_test_init(void) {           printk(KERN_EMERG "Hello0\n");             printk(KERN_ALERT "Hello1\n");     printk(KERN_CRIT "Hello2\n");        printk(KERN_ERR "Hello3\n");          printk(KERN_WARNING "Hello4\n");       printk(KERN_NOTICE "Hello5\n");            printk(KERN_INFO "Hello6\n");        printk(KERN_DEBUG "Hello7\n");             printk(KERN_DEBUG "Hello7\n");             printk(KERN_DEBUG "%s\n","Hello7-1");         PRINTM_MSG("No external FW image\n");     PRINTM(MSG, "No external FW image\n");     pr_debug("success!\n") ;     return 0; } static void printk_test_exit(void) {         printk(KERN_EMERG"Goodbye\n");      } module_init(printk_test_init); module_exit(printk_test_exit); 五:测试结果 转载:请注明,作者,下家山   请尊重原创!