广告

原创 MINI2440 中UCOS 学习

2011-5-6 09:31 3182 0 2 分类: 工程师职场

自己记点笔记 比较垃圾

void Lcd_printf(unsigned int x,unsigned int y,unsigned int c,unsigned int bk_c,unsigned int st,char *fmt,...)
{
    char __LCD_Printf_Buf[256];

  //原型是typedef int *va_list[1];   va_list是一个新的数据类型,这个类型是只有一个元素的数组,元素

 //是int*  指针
    va_list ap;

//字符串指针指向定义的BUF
 unsigned char *pStr = (unsigned char *)__LCD_Printf_Buf;
    unsigned int i = 0;

//#define va_start(ap, parmN) (void)(*(ap) = __va_start(parmN))

//使ap指向参数列表,...) 就是这个

    va_start(ap,fmt);

//然后按照fmt的格式把参数打印到_LCD_Printf这个buf里
    vsprintf(__LCD_Printf_Buf,fmt,ap);

//ap指针用完释放是个好习惯,ap=0活null
    va_end(ap);
 
    while(*pStr != 0 )
 {
  switch(*pStr)
  {
   case '\n' :
    {
   
                    break;
    }

   default:
    {
     if( *pStr > 0xA0 & *(pStr+1) > 0xA0 )  //中文输出 汉字的内码大于A0A0
                    {
                        Lcd_PutHZ( x , y , (*pStr - 0xA0)*0x0100 + *(pStr+1) - 0xA0 , c , bk_c , st);

                        pStr++;
                        i++;

                        x += 16;
                    }else               //英文输出
                    {
                        Lcd_PutASCII( x , y , *pStr , c , bk_c , st );

                        x += 8;

                    }

                    break;
    }
  }
  
  pStr++;
        i++; 

      //,pStr字符串应该有结束符

     // 可能在不正常的时候pStr中就没有结束符号,就要靠下面的代码了

        if( i > 256 ) break;
 }
  
}
#endif

//TASK
OS_STK  MainTaskStk[MainTaskStkLengh];
OS_STK Task0Stk [Task0StkLengh];       // Define the Task0 stack
OS_STK Task1Stk [Task1StkLengh];       // Define the Task1 stack
OS_STK Task2Stk [Task2StkLengh];       // Define the Task1 stack

把这些变量都粘贴到。h文件中发现不好用,经过百度得知,在头文件不能定义变量,只能声明变量

**************************************************************************************************************************
我在一个文件key.h中定义了几个全局变量,在target.c和key.c文件中都要用到,main函数在key.c里,target.c里有一段时钟的中断程序,编译时出现这样的语句:Error : L6200E: Symbol key1Ct multiply defined (by Target.o and KEY.o).

Error : L6200E: Symbol keyCt multiply defined (by KEY.o and Target.o).

我又在声明全局变量keyCt前加了extern,还是不行,请问应该怎样解决?Thank you very much!



头文一般仅声明变量,变量定义一般在c文件中。
从原理上来说是可以的。
在一个头文件中定义一个变量,那么在编译期(cp)是不会出错的。
每个cpp对应的obj里面的.data(或者.bss)段里面都含有这个变量符号,但是在链接(lk)的时候,一般系统会警告提示你说某个变量重复定义等。
假设你能链接程序成功,那么也是有可能的。

如果在头文件里面用extern   声明,但是在多个cpp文件里面进行定义,出现的情况可能是一样的。

上述两中定义,假设你能编译链接成功,但可能使得你的初始化会出现一些意想不到的结果。例如你在cpp1里面给你的定义赋值   a,   cpp2里面赋值为b,其实链接的时候,就没法知道到底表示的是几了。可能在不同的机器上编译的结果不一样。

加extern的叫声明

唉 还是C语言没学好 !!!!!

广告

文章评论 2条评论)

登录后参与讨论

billzhu_345737527 2012-10-8 10:13

有的地方还是不明白 无语

billzhu_345737527 2012-9-30 11:07

链接地址不行的啊
相关推荐阅读
mcuandme 2015-07-13 15:12
简单的固态继电器具有过零开关功能
本设计实例是一个固态继电器(SSR),它能利用双向晶闸管切换大电流的交流负载(图1)。市场上有大量简单的固态继电器电路,但这个电路可能是最简单的,它只在交流线路电压接近零时才导通和关断。 晶体管Q2...
mcuandme 2014-07-30 08:44
LIB和DLL的区别与使用
共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 ...
mcuandme 2013-12-19 22:16
Stellaris LM3S MCUs
今天买了个开发板 EKK LM3S3748 然后上网查资料是 Stellaris LM3S MCUs 系列的芯片 是CORTX M3 内核 但是TI官方网站已经推荐上级到  Upgrade...
mcuandme 2012-12-23 23:54
stm32 standby
对于ARM芯片(包括STM32),从STANDBY模式唤醒,代码就从复位入口开始运行,基本上等同于复位。  请在复位后,通过复位标志寄存器察看复位原因,也许会有所发现。 ...
mcuandme 2012-12-23 21:56
万利backup date 实验
发现了一个现象 当VBAT 接到电池上后写入数据 然后断电,然后把电池哪下来,这个时候在上电,发现backup中的数据还没有改变 需要把VBAT接到VDD 或地上后 ,数据才消失。 ...
mcuandme 2012-12-23 17:49
opengl
1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。 如果你曾经接触过TC的graphics.h,你会发现,使用O...
我要评论
2
0
广告
关闭 热点推荐上一条 /2 下一条