реклама на сайте
подробности

 
 
> Проблема с С и С++ ПОМОГИТЕ!
paravozru
сообщение Aug 14 2013, 09:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 2-07-12
Пользователь №: 72 586



Возникла проблема. Есть проект и в одном из циклов есть оператор break. При настройке IAR во вкладке Language1 я указываю следующие настройки.
Language: C
Language Confomance: Standart with IAR extension

Не работает оператор break. но вызываются прерывания.

При выборе C++ оператор break успешно работает но не вызываются прерывания.

Код
for (i = 0; i < MaxAmountPacket; i++) {
if (PackTurnSend[i].State == EmptyItem) {
PackTurnSend[i].BodyType = PacketType;
PackTurnSend[i].State = State;
PackTurnSend[i].Channel = Channel;
PackTurnSend[i].NumBytes = NumBytes;
PackTurnSend[i].TimeOut = TimeOut;
memcpy(PackTurnSend[i].Buff, buff, NumBytes);
result = i;
break;
}

Когда силы уже иссякли я взял с таймером TIM6 (вот отсюда http://chipspace.ru/stm32-basic-timer/#comment-346 ) и проверил. и в самом деле не работают прерывания когда выбираю C++.

Сообщение отредактировал IgorKossak - Aug 14 2013, 11:19
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DASM
сообщение Aug 14 2013, 14:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Их какбы нельзя вызывать прямо =) Сергей Борщ правильно сказал - у вас линковщик врубает заглушку. Опишите фунцию обработчик как extern "C"
Go to the top of the page
 
+Quote Post
paravozru
сообщение Aug 16 2013, 08:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 2-07-12
Пользователь №: 72 586



Код
void SendToCOM0 (void)  {                                                                       // функция вызывающая прерывание void USART1_IRQHandler  при попадании данных в регистр DR
   chList[chCOM1_0].State &= ~ ChannelWaitSend;
   chList[chCOM1_0].State |= ChannelBusySend;
        
    USART1->CR1 &= ~USART_CR1_RXNEIE;        
    USART1->CR1 |= USART_CR1_TE;        
    USART1->DR = chList[chCOM1_0].BuffOut[chList[chCOM1_0].ptrOutData];
    USART1->CR1 |= USART_CR1_TXEIE;
        
}

void USART1_IRQHandler (void)   {                                                 //  ну вот сама функция прерывания она не вызывается когда указываю C++
  
  uint8_t data;

  if (USART1->SR & USART_SR_RXNE) {                                                                                                        
      data = USART1->DR;
      chList[chCOM1_0].BuffIn[chList[chCOM1_0].ptrInData] = data;                                            
      chList[chCOM1_0].LenInData++;                                                                                                    
      chList[chCOM1_0].ptrInData++;
      //LedGreen(0x1FFFF);
        
  } else if (USART1->SR & USART_SR_TXE) {
             chList[chCOM1_0].ptrOutData++;
            
              if (chList[chCOM1_0].ptrOutData >= chList[chCOM1_0].LenOutData) {                
                  USART1->CR1 &= ~USART_CR1_TXEIE;                                                                        
                  USART1->CR1 |= USART_CR1_RXNEIE;    
                  chList[chCOM1_0].State &= ~ PacketWaitSend;        
                  chList[chCOM1_0].State &= ~ChannelBusySend;
              
              } else {
              USART1->DR = chList[chCOM1_0].BuffOut[chList[chCOM1_0].ptrOutData];
              //LedBlue(0x1FFF);
                                
        }
    }
}


Объясните где нужно ставить extern C как это будет выглядит ?!
Go to the top of the page
 
+Quote Post
Lotor
сообщение Aug 16 2013, 10:24
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Как-то так...
Код
#ifdef __cplusplus
extern "C" {
#endif
void USART1_IRQHandler (void)   { //  ну вот сама функция прерывания она не вызывается когда указываю C++
...
}
#ifdef __cplusplus
}
#endif


Цитата(paravozru @ Aug 16 2013, 12:35) *
Объясните где нужно ставить extern C как это будет выглядит ?!

А что мешает Вам погуглить ответ на этот популярный вопрос? Вектор поиска уже дали.

PS: Можете просто приписать extern "C" перед void USART1_IRQHandler (void)


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
paravozru
сообщение Aug 16 2013, 11:48
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 2-07-12
Пользователь №: 72 586



Цитата(Lotor @ Aug 16 2013, 13:24) *
Как-то так...
Код
#ifdef __cplusplus
extern "C" {
#endif
void USART1_IRQHandler (void)   { //  ну вот сама функция прерывания она не вызывается когда указываю C++
...
}
#ifdef __cplusplus
}
#endif



А что мешает Вам погуглить ответ на этот популярный вопрос? Вектор поиска уже дали.

PS: Можете просто приписать extern "C" перед void USART1_IRQHandler (void)

Ну первым делом я полез в Гугл )) ну вроде делал как описано в примерах, но не получалось. В итоге сделал так:
В заголовочном файле перед объявлением функции добавил extern "С"
Код
extern "C" void USART1_IRQHandler (void);

В .с файле где исполняется функция так :
Код
#ifdef __cplusplus
extern "C" {
#endif
void USART1_IRQHandler (void)   {

  uint8_t data;

  if (USART1->SR & USART_SR_RXNE) {                                                                                                        
      data = USART1->DR;
      chList[chCOM1_0].BuffIn[chList[chCOM1_0].ptrInData] = data;                                            
      chList[chCOM1_0].LenInData++;                                                                                                    
      chList[chCOM1_0].ptrInData++;
      //LedGreen(0x1FFFF);
        
  } else if (USART1->SR & USART_SR_TXE) {
             chList[chCOM1_0].ptrOutData++;
            
              if (chList[chCOM1_0].ptrOutData >= chList[chCOM1_0].LenOutData) {                
                  USART1->CR1 &= ~USART_CR1_TXEIE;                                                                        
                  USART1->CR1 |= USART_CR1_RXNEIE;    
                  chList[chCOM1_0].State &= ~ PacketWaitSend;
                  
                  chList[chCOM1_0].State &= ~ChannelBusySend;
              
              } else {
              USART1->DR = chList[chCOM1_0].BuffOut[chList[chCOM1_0].ptrOutData];
              //LedBlue(0x1FFF);
                                
        }
    }
}

#ifdef __cplusplus
}
#endif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016