Easyelectronics.ru

Электроника для всех
Текущее время: 01 апр 2020, 14:23

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: KEIL inline
СообщениеДобавлено: 05 дек 2014, 02:53 
Только пришел

Зарегистрирован: 16 янв 2013, 03:10
Сообщения: 12
Проблема следующая.

Пишу ф-ю в файле main.c :
inline void Beep_OFF(void)
{
TIM16->CR1 &= ~TIM_CR1_CEN; //выключить пищалку
}
Пишу ф-ю в файле main.h :
void Beep_OFF(void) __attribute__((always_inline));

Вызываю ф-ю Beep_OFF(); в файле main.c
В дизасме вижу:
62: Beep_OFF();
63:
0x080002FC BF00 NOP
0x080002FE 4850 LDR r0,[pc,#320] ; @0x08000440
0x08000300 8800 LDRH r0,[r0,#0x00]
0x08000302 F0200001 BIC r0,r0,#0x01
0x08000306 494E LDR r1,[pc,#312] ; @0x08000440
0x08000308 8008 STRH r0,[r1,#0x00]
31: }
Все как и положено, ф-я inline.

Вызываю ф-ю Beep_OFF(); в файле charge.c
В дизасме вижу:
46: Beep_OFF();
0x080019B0 F006F81E BL.W Beep_OFF (0x080079F0)
Ф-я не inline, она вызывается.

Как сделать так, чтоб во всех файлах ф-я была inline?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL inline
СообщениеДобавлено: 06 дек 2014, 21:44 
Только пришел

Зарегистрирован: 16 янв 2013, 03:10
Сообщения: 12
Прочитал что ф-я должна быть со спецификатором static. А как сделать чтоб во всех файлах ф-я была встраиваемой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: KEIL inline
СообщениеДобавлено: 06 дек 2014, 22:38 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
Функция в файле main.c. Во время компиляции charge.c компилятору не известно содержание этой функции и он не сможет ее встроить. Вызов и определение должны быть в одном файле. Либо используйте макросы. Либо откажитесь от встраивания. Почему так нужен инлайн?

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL inline
СообщениеДобавлено: 06 дек 2014, 23:03 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3312
Либо определите функцию в инклюде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL inline
СообщениеДобавлено: 07 дек 2014, 12:41 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5822
Посмотреть как сие уже реализовано в CMSIS , к примеру SysTick_Config .
Прописано в хэдере и :
Код:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */

  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}


и
Код:
#if   defined ( __CC_ARM )
  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */
  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */
  #define __STATIC_INLINE  static __inline


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL inline
СообщениеДобавлено: 03 фев 2015, 18:52 
Только пришел
Аватара пользователя

Зарегистрирован: 03 фев 2015, 18:46
Сообщения: 27
Откуда: spb
Тоже вылезла проблема с KEIL

Устанавливаю 1 в
BSRR_BS_12;
Сбрасываю 1
BSRR_BR_12;
Всё вышесказанное в Keil 5.11 компилится без багов но в железе
последняя строчка не выполняется, т.е. устанавливается 1 на пине порта и все...

А запись вида
BSRRL |= 0x1000;
BSRRH |= 0x1000;
работает...

т.е устанавливается 1 и потом затирается.
В чем может быть загвостка?
камень stm32f407


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL inline
СообщениеДобавлено: 03 фев 2015, 20:21 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5822
Там баг в хэдере .
Юзай только
Код:
BSRR_BS_12

И для установки и для сброса.
Код:
GPIOx->BSRRL =BSRR_BS_12;
GPIOx->BSRRH =BSRR_BS_12;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL inline
СообщениеДобавлено: 04 фев 2015, 12:44 
Только пришел
Аватара пользователя

Зарегистрирован: 03 фев 2015, 18:46
Сообщения: 27
Откуда: spb
dosikus_2 писал(а):
Там баг в хэдере .
Юзай только
Код:
BSRR_BS_12

И для установки и для сброса.
Код:
GPIOx->BSRRL =BSRR_BS_12;
GPIOx->BSRRH =BSRR_BS_12;



...Неожиданно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL inline
СообщениеДобавлено: 04 фев 2015, 22:33 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5822
Привыкай к ляпам в документации и исходниках ST.
Регистры определены как 16битные , к чему?
Код:
__IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */


В то время как биты ...

Код:
#define GPIO_BSRR_BR_12                      ((uint32_t)0x10000000)


При таких ляпах начнешь задумываться о "полезности" SPL и куба ... :)))))))))


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB