Jump to content

    
alexast

Помогите разобраться с ошибкой

Recommended Posts

/* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();
 
int Alex;
Alex = 10;
printf("%d\n",Alex);

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_RTC_Init();
  MX_TIM1_Init();
  MX_WWDG_Init();
  MX_FATFS_Init();

И вот далее такая ошибка:

Warning[Pe550]: variable "Alex" was set but never used C:\Астахов Алексей\Программирование НАМИ\IAR\USB\USB_virtual_com_port\Core\Src\main.c 103

Заранее всем спасибо за рекомендации.

Без: int Alex;
Alex = 10;
printf("%d\n",Alex);

ранее компилировалось.

Цели мои посмотреть куда эта постоянная в IDE будет сбрасываться. Можно ли я её увидеть при помощи printf

Ещё раз спасибо за ответы

Share this post


Link to post
Share on other sites
22 minutes ago, alexast said:

Заранее всем спасибо за рекомендации.

А что Вам непонятно?) Это у Вас не ошибка, а предупреждение. И компилятор предупреждает, что переменная Alex объявлена, инициализирована, но не используется.

23 minutes ago, alexast said:

ранее компилировалось.

Значит, либо она использовалась, либо Вы не замечали предупреждение. Оно и сейчас компилируется. Предупреждения (warnings) и ошибки (errors) вещи немного разные.

23 minutes ago, alexast said:

Цели мои посмотреть куда эта постоянная в IDE будет сбрасываться

IDE здесь вообще не при делах. В сборке проекта участвуют: препроцессор, компилятор, ассемблер и линковщик. Возможно, что ещё некоторые утилиты. Но это уже сугубо индивидуально.

Share this post


Link to post
Share on other sites
56 минут назад, haker_fox сказал:

И компилятор предупреждает, что переменная Alex объявлена, инициализирована, но не используется.

а printf() разве не ее использует?

Share this post


Link to post
Share on other sites
34 minutes ago, Сергей Борщ said:

а printf() разве не ее использует?

Её. Но мне сообщение автора не совсем понятно(( Если printf использует эту переменную, то почему же компилятор выдаёт предупреждение, мне не ясно...

Share this post


Link to post
Share on other sites

Вангую условную компиляцию. Посредством которой printf() превратился в тыкву #define printf(...). Отсюда и неиспользование переменной.

Как всегда - всё элементарно решается одним взглядом в листинги, но почему-то народ упорно их игнорирует....  :unknw:

Share this post


Link to post
Share on other sites

Уважаемые друзья, всем большое спасибо за ответ.

Попробую внести ещё ясность. Первое чего я хотел добиться это после исполнения программы в среде IAR (debug) увидеть в каком-то из окон печать цифры 10. Я хочу понять после загрузки и начале отладки программы в микроконтроллере как дебаг будет мне показывать и будет ли показывать это число. - Не увидел.

Следующее. До того как я ввёд в код 

int Alex;
Alex = 10;
printf("%d\n",Alex); 

всё было нормально компилировалось и исполнялось с микроконтроллере.

После стал ругаться и показывать на инициализацию ножки. 

Подошлю потом код.

И программа в дебаге останавливается на строке printf("%d\n",Alex); 

Но далее вообще не понятно. 

Если из кода убрать "закомментировать" эту часть, то увы опять проблемы не уходят.

У меня складывается такое впечатление, что загрузка кода была осуществлена в микроконтроллер с последующей инициализацией ножки на выход (туда что-то выдает принт). Это прошивка там и осталась и после комментирования кода несмотря на  переиницализации остаётся в каком-то неясном состоянии. Но вообще это звучит фантастически. Не фантастикой является "ругань" компилятора даже после комментирования кода.

Вот такая информация.

Заранее всем спасибо.

"Может быть, удосужишься открыть файл и посмотреть. что там на 103й строке, раз компилятор на нее указывает?"

Завтра подошлю.

С уважением Алексей.

Share this post


Link to post
Share on other sites
6 hours ago, alexast said:

Но вообще это звучит фантастически.

Без обид, но фантастически звучит Ваш каждый пост с учётом норм русского языка. Пишите, пожалуйста, для всех. И не стоит писать разным шрифтом на разном фоне. 

6 hours ago, alexast said:

микроконтроллер с последующей инициализацией ножки на выход (туда что-то выдает принт).

Само это не происходит. Только если не Вы самостоятельно это сделали, или это не сделали те библиотеки, которые используются.

Share this post


Link to post
Share on other sites

printf делается примерно так

int _write(int file, char* ptr, int len)
    {	
	HAL_UART_Transmit(&huart1,ptr, len, 1000);	
	return len;
    }

тут все, что выводится printf- посылается в данном случае через uart1. можно также выводить в окно ide- гуглить "semihosting stm32" (я пока с этим не разрбрался)

Share this post


Link to post
Share on other sites
17 minutes ago, cybersonner said:

printf делается примерно так

По-моему, это просто print.

Я делаю так (в контексте ОСРВ) прямо из проекта. Формат аргументов kprintf точно такой же как и у настоящего printf.

void kprintf( const char * arg_list, ... ) {
    OsApi::MutexLocker mutex(s_mutex); // ждём мьютекс, т.к. мы ни одни используем форматированный вывод в консоль
    if (mutex.take(500) != RetVal::Ok)
        return; 	// не дождались((
    va_list arg_buffer;
    char * tbptr = kprintfBuffer;
    va_start(arg_buffer, arg_list);
    vsprintf(tbptr, arg_list, arg_buffer); // парсим форматированную строку
    va_end(arg_buffer);
    getUsart().write(kprintfBuffer, strlen(kprintfBuffer)); // скармливаем после парсера содержимое буфера в драйвер УСАПП
}

 

Share this post


Link to post
Share on other sites
3 minutes ago, Arlleex said:

Кто такой s_mutex?

static OsApi::Mutex s_mutex;

И сама оболочка

namespace OsApi {
    class Mutex : public OS::TMutex {
    public:
        Mutex() {}
        RetVal take( size_t timeout_ms ) {
            return try_lock(timeout_ms) ? RetVal::Ok : RetVal::TimeOut;
        }
        RetVal give() {
            unlock();
            return RetVal::Ok;
        }
    private:
        friend class MutexLocker;
    };

    class MutexLocker {
    public:
        MutexLocker( Mutex &mt )
            : m_mt(mt) {}
        RetVal take( size_t timeout_ms ) {
            return m_mt.take(timeout_ms);
        }
        ~MutexLocker() {
            m_mt.give();
        }
    private:
        Mutex m_mt;
    };
}

Это для изоляции от FreeRTOS и scmRTOS.

Share this post


Link to post
Share on other sites
3 minutes ago, Arlleex said:

А, статический член класса, понял, спасибо.

Не) Статический объект класса. А сами классы не содержат статических методов и членов.

Share this post


Link to post
Share on other sites
31 минуту назад, haker_fox сказал:

По-моему, это просто print.

это функция, которая по итогу будет вызвана, если в коде, сгенерированном Stm32CubeMx (а судя по комментариям- топикстартер в нем генерирует) написать printf. Она изначально weak, поэтому написав ее, можно перенаправить вывод printf куда нам надо (в моем случае в uart1).

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.