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

 
 
> ARM, C++, IAR. Проблема., STM32F4
Geniok
сообщение Nov 11 2012, 22:02
Сообщение #1





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



Всем добрый день!
Возникла проблема следующего рода. При компиляции проекта на С++, программа стопорится при попытке вызова системного прерывания.
Используется IAR версии 6.40.2, стандартные библиотеки CMSIS.

Конкрентно виснет на функции delay(), которая реализована следующим образом:

Код
// Функция задержки (паузы) в работе
void Delay(__IO uint32_t nTime)
{
    TimingDelay = nTime;

    // Крутимся в бесконечном цикле, пока счетчик
    // оставшегося времени не станет равным нулю.
    // Уменьшение счетчика происходит с помощью
    // прерываний системного таймера.
    while(TimingDelay != 0);
}

// Функция уменьшения счетчика задержки (паузы)
void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00)
    {
        TimingDelay--;
    }
}

В файле stm32f4xx_it.c определяем функцию

Код
void SysTick_Handler()
{
    TimingDelay_Decrement();
}


Виснет в файле startup_stm32f4xx.s в блоке

Код
PUBWEAK SysTick_Handler
        SECTION .text:CODE:REORDER(1)
SysTick_Handler
        B SysTick_Handler    ///  !!!!!!!!   Вот тут останавливается исполнение.


То есть как я понимаю, не может найти реализацию функции SysTick_Handler().

Когда проект был на С, данный код работал. Может кто знает, как его заставить работать на С++ ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MK2
сообщение Nov 22 2012, 18:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



Что бы не плодить лишних тем, рушил написать сюда.
Итак компилятор IAR 6.40 чип stm32f100
часть проекта уже написана на С, и сейчас решил остальное дописать на С++
поэтому поставил в настройках галку Auto на вкладке С/С++ compiler
Прикрепленное изображение

и написал простенький класс:
Код
// class.h
#include "stm32f10x.h"

#define MAX_BUF_UART    10

class UART1 {
          protected :
      uint8_t buf [MAX_BUF_UART];
      static uint8_t current, send_point;
          public :
      UART1(void)
      { current = 0;
              send_point = 0; }
      
       uint8_t cop_buf(uint8_t byte);
       void start_send(void);
            };

Код
class.cpp
#include "stm32f10x.h"
#include "class_UART.h"

#define current this->current
#define send_point this->send_point

uint8_t UART1::cop_buf(uint8_t byte)
{      
.....
    buf[current] = byte;
    current++;
    current %= MAX_BUF_UART;
    return 0;
}

void UART1::start_send(void)
{
      for(; send_point != current; send_point++)
      {
                 USART1->DR = buf[send_point];
     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    
     send_point %= MAX_BUF_UART;
      };
}

void testcpp(void)
{
     UART1 port;
      port.cop_buf('t');
      ......
      port.start_send();
}


далее testcpp() вызываю в в ф-ции main

и ругается линковщик

Код
Error[Li005]: no definition for "testcpp" [referenced from Z:\bla-...-bla-bla\Obj\main.o]


хотя её объявление перед main присутствует;
и еще почему то не удается сделать UART1 port глобальным объектом (вынести перед void testcpp(void))
в этом случае добавляются такие error :
Код
Error[Li005]: no definition for "UART1::current" [referenced from Z:\bla-...-bla-bla\Obj\class_UART.o]
Error[Li005]: no definition for "UART1::send_point" [referenced from Z:\bla-...-bla-bla\Obj\class_UART.o]


что здесь не так? плюсы знаю не очень, как это подружить с IAR?
есть какие-нибудь примеры под него? гугл ничего не дал
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Geniok   ARM, C++, IAR. Проблема.   Nov 11 2012, 22:02
- - _Артём_   Цитата(Geniok @ Nov 12 2012, 00:02) То ес...   Nov 11 2012, 22:27
|- - Geniok   Цитата(_Артём_ @ Nov 12 2012, 02:27) Что-...   Nov 11 2012, 22:43
- - ReAl   Цитата(Geniok @ Nov 12 2012, 00:02) В фай...   Nov 11 2012, 22:30
|- - _Артём_   Цитата(ReAl @ Nov 12 2012, 00:30) Странно...   Nov 11 2012, 22:44
|- - Geniok   Цитата(ReAl @ Nov 12 2012, 02:30) Странно...   Nov 11 2012, 23:30
||- - Сергей Борщ   QUOTE (Geniok @ Nov 12 2012, 01:30) Скоре...   Nov 12 2012, 07:50
|- - Непомнящий Евгений   Цитата(ReAl @ Nov 12 2012, 02:30) Странно...   Nov 12 2012, 07:12
|- - _Артём_   Интересно, в чём смысл этих макросов: Цитата(MK2 ...   Nov 22 2012, 20:23
|- - Сергей Борщ   QUOTE (MK2 @ Nov 22 2012, 20:25) далее te...   Nov 22 2012, 20:26
- - MK2   Цитата(_Артём_ @ Nov 22 2012, 23:23) Инте...   Nov 22 2012, 21:14
|- - _Артём_   Цитата(MK2 @ Nov 22 2012, 23:14) Да, main...   Nov 22 2012, 21:33
- - MK2   Программа завелась... правда подвели макросы... Сп...   Nov 23 2012, 11:58
- - _Артём_   Цитата(MK2 @ Nov 23 2012, 13:58) посмотри...   Nov 23 2012, 21:04
- - MK2   Цитата(_Артём_ @ Nov 24 2012, 00:04) Реаг...   Nov 29 2012, 15:18
- - _Артём_   Цитата(MK2 @ Nov 29 2012, 17:18) так же н...   Nov 29 2012, 15:26
- - AHTOXA   Вот так точно работает: Кодextern "C" void...   Nov 29 2012, 16:36


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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 19:59
Рейтинг@Mail.ru


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