OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6866|回复: 1

关于UCOSII 变量,数组定义,编译问题

[复制链接]

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2013-11-19
在线时间
22 小时
发表于 2014-5-4 22:02:13 | 显示全部楼层 |阅读模式
5金钱





各位大侠,首先,我想问一个关于编译的问题。。。
NO1:  我在APP.C里面#define GLOBALS ,然后当进入demo.h编译的时候,遇到EXT是不是就自动转换为空格了,也就是说,不是外部的了?
而对于其他.c文件,比如说bsp.C, 当遇到ext以后,该怎么处理?   是要把ext变味extern吗?)
        为什么要声明称EXTERN类型的呢? (如果不这么声明,好像会报错,重复定义)。。这点,很不解。。。


NO2,我想做DAM实验,在程序了定义一个DMA_SendBuff[10]={0x00,0x01,0x02……一直到0x09},但是当在demo.h中声明的时候,总是报错。。。我该怎么声明?


求高手指点???



部分代码:bsp.c

#include <includes.h>
//#include "stm32f10x.h"

INT16U DMA1_MEM_LEN; //保存DMA每次数据传送的长度  
DMA_InitTypeDef DMA_InitStructure;

void BSP_Init(void)
{
  RCC_Configuration();
  GPIO_Configuration();
  USART_Config(USART1,9600 )  ;
   My_DMA_Config();
  NVIC_Configuration();
  
//EXTI_Configuration();
}

void RCC_Configuration(void)
{
 SystemInit();

}
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOD,&GPIO_InitStructure);

  GPIO_SetBits(GPIOA,GPIO_Pin_8);
  GPIO_SetBits(GPIOD,GPIO_Pin_2);



}

void My_DMA_Config(void)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输

    DMA_DeInit(DMA1_Channel4);   //将DMA的通道1寄存器重设为缺省值
  
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);  //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&DMA_SendBuff;  //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //外设作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = 10;  //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel4, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC, ENABLE);

    DMA_Cmd(DMA1_Channel4, ENABLE);  // Enable DMA Channel1      
 



 

void NVIC_Configuration(void) //中断源配置
{
   NVIC_InitTypeDef NVIC_InitStructure;

   #ifdef  VECT_TAB_RAM
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  /* Set the Vector Table base location at 0x20000000 */
   #else  
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  /* Set the Vector Table base location at 0x08000000 */
   #endif

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//先占优先级4位,从优先级0位 ;有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断
   //配置外部中断线 13,发送信号量(but 貌似有问题,不知道怎么回事,按键一下,灯亮很多次?抖动?)
   NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //设置外部中断线EXTI15_10 优先级为4 
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
   NVIC_Init(&NVIC_InitStructure);


   //配置串口中断
   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
   NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
   

}



报错:.\Output\DA_Transfer.axf: Error: L6200E: Symbol DMA_SendBuff multiply defined (by stm32f10x_it.o and app.o).



app.c中#define GLOBALS
#include <includes.h>  

static OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];
static OS_STK led0_task_stk[LED0_TASK_STK_SIZE];
static OS_STK led1_task_stk[LED1_TASK_STK_SIZE];
static OS_STK usart_task_stk[USART_TASK_STK_SIZE];

static  void startup_task(void *p_arg);
static  void led0_task(void* p_arg);
static  void led1_task(void* p_arg);
static  void usart_task(void* p_arg);



static void systick_init(void);// 函数声明
static void systick_init(void)
{
 RCC_ClocksTypeDef rcc_clocks;
 RCC_GetClocksFreq(&rcc_clocks);
 SysTick_Config(rcc_clocks.HCLK_Frequency/OS_TICKS_PER_SEC);
}

//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 

int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 

x = x; 

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
return ch;
}
#endif 
int main(void)
{
 
 
 BSP_Init();
 OSInit();

 OSTaskCreate( startup_task,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
 OSTimeSet(0);
 OSStart();
 return 0;
 
}

static void startup_task(void *p_arg)
{
 p_arg=p_arg;
 systick_init();
#if (OS_TASK_STAT_EN>0)
     OSStatInit(); /* Determine CPU capacity. */
#endif
 SEM=OSSemCreate(0);
 OSTaskCreate(led0_task,(void *)0,&led0_task_stk[LED0_TASK_STK_SIZE-1],LED0_TASK_PRIO);
 OSTaskCreate(led1_task,(void *)0,&led1_task_stk[LED1_TASK_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(usart_task,(void *)0,&usart_task_stk[USART_TASK_STK_SIZE-1],USART_TASK_PRIO);
 OSTaskDel(OS_PRIO_SELF);
}


void usart_task(void* p_arg)
{
  INT16U time;
 p_arg=p_arg;
 while(1)
 {  
  
  time++;
  if(time>20)
  {
    time=0;
printf("\n您发送的消息为:\n");
  }
  
  
  OSTimeDlyHMSM(0, 0, 0, 50);

 }


}


static  void led0_task(void* p_arg)
{
   INT8U err,i;
   p_arg=p_arg;    
   while (1)
   { 
    OSSemPend(SEM,0,&err);
for(i=0;i<3;i++)
{
 LED0_ON();
OSTimeDlyHMSM(0, 0, 0, 100);
LED0_OFF();
OSTimeDlyHMSM(0,0,0,200);
}
    
   }
}

static  void led1_task(void* p_arg)
{
   p_arg=p_arg;    
   while (1)
   { 
    LED1_ON();
OSTimeDlyHMSM(0, 0, 0, 500);
LED1_OFF();
OSTimeDlyHMSM(0,0,0,500);
   }
}



可能描述的比清楚,希望高手能留个QQ   我的      409801643

最佳答案

查看完整内容[请看2#楼]

1,ext是ucosii自己定义的一个东西,其实就是extern.ucosii下面,ext==extern.extern就是声明改变量/函数,在本文件之外的其他文件被定义了.所以在本文件也可以正常使用.但是前提一定是:别的文件必须有定义. 2,在头文件里面不宜定义数组/函数实体,这样多个.c文件包含这个.h文件的时候,就会出现重复定义.你可以在.c文件定义,然后在.h文件用extern声明,这就很好的解决这个问题了. 3,你这个报错,就是2个.c文件重复定义了同一个函数.导致报 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2014-5-4 22:02:14 | 显示全部楼层
1,ext是ucosii自己定义的一个东西,其实就是extern.ucosii下面,ext==extern.extern就是声明改变量/函数,在本文件之外的其他文件被定义了.所以在本文件也可以正常使用.但是前提一定是:别的文件必须有定义.
2,在头文件里面不宜定义数组/函数实体,这样多个.c文件包含这个.h文件的时候,就会出现重复定义.你可以在.c文件定义,然后在.h文件用extern声明,这就很好的解决这个问题了.
3,你这个报错,就是2个.c文件重复定义了同一个函数.导致报错.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 12:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表