原创 MINI2440 中UCOS 学习

2011-5-6 09:31 4027 7 9 分类: 工程师职场

自己记点笔记 比较垃圾

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语言没学好 !!!!!

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户377235 2012-10-8 10:13

有的地方还是不明白 无语

用户377235 2012-9-30 11:07

链接地址不行的啊
相关推荐阅读
mcuandme 2020-03-14 23:15
18位、线性、低噪声、精密双极性±10 V直流电压源
www.analog.com/zh/CN0200...
mcuandme 2020-03-14 21:51
C语言printf("")左对齐和右对齐 (转)
https://blog.csdn.net/abcdu1/article/details/74926375  原文地址1.左对齐方式1printf("%d\n",101010);默认打印格式...
mcuandme 2020-03-14 21:45
放大器电路设计中的常见问题经验总结
源地址:https://www.cnblogs.com/huanzxj/p/5667633.html与分立器件相比,现代集成运算放大器(op amp)和仪表放大器(in-amp)为设计工程师带来了许多...
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...
EE直播间
更多
我要评论
2
7
关闭 站长推荐上一条 /3 下一条