Перейти к содержанию
Авторизация  
BERNARD

Вопросы о странности работы IAR

Рекомендуемые сообщения

Дата: (изменено)

Приветствую уважаемое сообщество! Собственно проблема в названии темы. Есть у меня в наличии IAR 3.11 (это последний релиз) для STM8 на моём ноутбуке. Так вот к нему имеется большой вопрос-он не хочет обрабатывать функции как при их предварительном объявлении, так и при их описании до функции main, особенно это касается функций описания периферии. Если размещать эти же функции внутри main-а, то работает. Похоже как будто на то, что вне главной функции среда разработки видеть текст не хочет (особенно это касается библиотечных функций описания аппаратной части). Проект собирался классически для IAR-а с использованием SPL, при том что компиляция и сборка проходят без ошибок и предупреждений вообще, используются только хеадеры и исходники только родные, из архива с сайта ST.

Какие мнения могут быть по поводу такого поведения IAR, может случалось у кого? Не может ли это быть следствием некоего неявного конфликта ОС и среды разработки? А то на этой же операционке  то же STVD ругается при запуске с некоей ошибкой и не хочет трудиться. ОС переустановить можно, конечно, это не проблема, но хочется понять в чём дело.

Да, картинки с примерами исходников дам к вечеру, когда до ноутбука доберусь.

 

Изменено пользователем BERNARD

Поделиться сообщением


Ссылка на сообщение

Так работает XP  IAR  6.1, или я не понял вопрос?

// Режимы работы. По-умолчанию 12 бит.
void delay_ms(uint16_t );
 void x_delay(unsigned int);               //задержка
 void TIM2_WR(uint8_t,uint8_t);           //запуск таймера TIM2
uint8_t PrintChar(uint8_t); //байт в СОМ 
uint8_t OutChar(void); 
 void uart_tx_data(unsigned char * data, unsigned char len);
 void uart_rx_data(unsigned char * data, unsigned char len);
extern void uart_tx_byte(unsigned char data);
extern unsigned char uart_rx_byte();
volatile uint16_t count;
volatile uint16_t adc2;
void init_lcd(void);
void print_lcd(unsigned char * data,unsigned char len);
static void Init_UART(void);              // инициализация приемо-передатчика СОМ
static void TIM1_Config(void);            //конфигурация таймера  
volatile bool User_Key_Pressed = 0;
volatile char iCurrentTemp = 0;
u8 date;
u8 data,data1;

u8 BlinkSpeed = 6;
//u16 Counter=1;
u8 counter=0;
u8 count_step=0;
u8 PeriodNumber = 0;
 u8 statusWire=0;
 u8 flag=0;
 u8 cmd;        //признпк откуда прерывание
uint8_t rh;     // старший рег таймера
uint8_t rl;     //млад. рег таймера
bool flag_Interrupt=0; //флаг прерывания таймера
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void TIMER_Configuration(void);
void Blinking_StateMachine(void);
 u8 US_FLAG=0, IN_MEASURE=0;

 


void main(void)

Поделиться сообщением


Ссылка на сообщение
Дата: (изменено)

Как обещал, пример исходника. Он прост, две строчки всего. На данном изображении (первом по порядку) абсолютно рабочий код, настройка тактирования и вывод на ножку настраиваемой частоты, в данном случае 16 МГц.  На картинке ниже (номер два) показан его режим отладки, видно, что выполнение начинается прямо с первой строчки (сброс системы тактирования до исходных настроек). А на номере три и четыре показан нерабочий код настройки тактирования. На снимке его отладчика (номер 5) видно, что выполнение начинается не с функции настройки, а сразу с функции вывода частоты на ножку МК.

Рабочий исходник.jpg 

Рабочий код режим отладки.jpg 

Нерабочий код 1.jpg 

Нерабочий код 2.jpg 

Режим отладки нерабочий код.jpg 

Изменено пользователем BERNARD

Поделиться сообщением


Ссылка на сообщение
Дата: (изменено)

Ну и разумеется, во втором случае сразу запускается система контроля тактовой частоты CSS и частота приходит 2 МГц. Кстати, на третьей картинке компилятор ругается на наличие модификатора static, несмотря на то, что данное ключевое слово изначально добавлено в фирменные файлы библиотек от ST (как я понял, добавленного для однократности запуска библиотеки при инициализации МК, как и в ответе ув. alw39, в его примере). И это при том, что в одном из найденных мной на одном небезызвестном видеохостинге роликов компилятор на это не плюётся, а выполнение компиляции проходит без ошибок. Мой старый товарищ-программист сказал мне, что функция игнорируется, если она определена неправильно, хотя я сделал копипасту из архива заводских библиотек.

Так что вот такая проблема, господа. Головой я понимаю, что скорее всего ошибка у меня самого, но не могу понять где. Кто что скажет? Буду рад слышать любое мнение.

Изменено пользователем BERNARD

Поделиться сообщением


Ссылка на сообщение
Дата: (изменено)

Почему в вызове функции в параметрах (void), мой компилятор на такое дает ошибку , обычно если вызов без параметров то просто функция().

С void видимо  считает это повторной декларацией. У меня в настройках язык С , но вроде в С++ так же.

http://forum.easyelectronics.ru/viewtopic.php?f=33&t=20854&sid=e7b664ae91d1081e4ad22f3ed225842e тут немного по static 

Изменено пользователем alw39

Поделиться сообщением


Ссылка на сообщение
Только что, alw39 сказал:

мой компилятор на такое дает ошибку

Так и должно быть, странно если это не так.
void func(void); // объявление функции
func(); // вызов функции

Поделиться сообщением


Ссылка на сообщение
Дата: (изменено)

Да, господа. Трижды да. Я слегка ошибся. Поправил исходник в части обращения к функции и всё заработало. Практики в программировании маловато. Спасибо за помощь. Тему закрывать не буду, мало ли какая ещё штука приключится

Изменено пользователем BERNARD

Поделиться сообщением


Ссылка на сообщение

Господа, день добрый! А подскажите, может кто задумывался над вопросом правильности глобального включения прерываний при инициализации периферии в STM-ах? Поясню на примере (это функционал из стандартных SPL):

 void TIM4_setup(void)
{               
    TIM4_DeInit();
    TIM4_TimeBaseInit(TIM4_PRESCALER_32, 128);      
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
    TIM4_Cmd(ENABLE);
    enableInterrupts();
}

Т.е. хотим мы получить некую подпрограмму обработки прерывания по переполнению таймера TIM4. Нарисовали, всё работает, все счастливы. А если нам необходимо будет таким же образом настроить и другую периферию одновременно, которая использует прерывания (те же таймеры, TIM1, допустим), там как должно быть правильно? Надо ли уже проверять, что команда прерываниям отдана или нет? Или вообще следует включить прерывания для всей периферии разом и не морочить голову?

Поделиться сообщением


Ссылка на сообщение
В 20.08.2021 в 10:39, BERNARD сказал:

Или вообще следует включить прерывания для всей периферии разом и не морочить голову

Если память меня не подводит то после инициализации таймеров и проч. разрешаем прерывания  enableInterrupts();

Поделиться сообщением


Ссылка на сообщение
1 час назад, alw39 сказал:

Если память меня не подводит то после инициализации таймеров и проч. разрешаем прерывания  enableInterrupts();

Да, много где так написано. И работает абсолютно корректно. Но я поднял мануалы, в них утверждается, что enableInterrupts можно в начале.SNAG-21090819063400.thumb.png.93661cead76a52bb1bf3b3827e4edf21.png

Попробовал в железе и так, и так. Работает одинаково. У меня другой вопрос. Просветите, пожалуйста, что это за синтаксическая конструкция в тексте, между слэшами? С комментариями всё ясно, они и выделены зелёным. Как она называется и зачем необходима? Не могу ответ сам найти.SNAG-21090818485200.thumb.png.9cd99cecf3316c49fc5e7d1da44191d3.png

Поделиться сообщением


Ссылка на сообщение

Мой старинный товарищ и просто хороший программист указал на это, как на комментарий. Я эксперимента ради убрал одну звёздочку, сделал просто однострочный. И ничего, скомпилировалось без ошибок. В железе, правда, пока не опробовал.

Поделиться сообщением


Ссылка на сообщение

Господа, доброго времени суток. Подскажите, кто знает, каково назначение подчёркивания (в случае картинки двойного) в HeaderGuard? А то я не могу найти ответа в мануалах, везде без него всё написано. Это какая-то фича для STM или некое стандартное действие в С?

Нижнее подчёркивание.jpg 

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...

Важная информация

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