Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/62: Рейтинг темы: голосов - 62, средняя оценка - 4.92
drokom
0 / 0 / 0
Регистрация: 20.04.2013
Сообщений: 11
1

KEIL inline

04.12.2014, 02:06. Просмотров 11216. Ответов 8
Метки нет (Все метки)

Проблема следующая.

Пишу ф-ю в файле main.c :
inline void Beep_OFF(void)
{
TYM16->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?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2014, 02:06
Ответы с готовыми решениями:

Keil v5
Установил новый Keil. В старой 4-й версии проект симулировался нормально. Сейчас выдает такое...

Keil
Доброго времени суток! Попытался повторить проект вот отсюда -...

Stm32 и Keil
Здравствуйте, помогите пожалуйста. Пытаюсь оценить ограничения Keilа. 32 кб этого хватит для таких...

ST-Link + Keil
Приехала платка STM32Dyscovery. Написал простейший проект для мигаяния светодиодиком. Подрубил...

Keil and Eclipse
Установил Eclipse Ymdyko, встроил в нее Keil 4.23. Импортировал проект из...

8
drokom
0 / 0 / 0
Регистрация: 20.04.2013
Сообщений: 11
05.12.2014, 20:57 2
Прочитал что ф-я должна быть со спецификатором static. А как сделать чтоб во всех файлах ф-я была встраиваемой.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
05.12.2014, 21:51 3
Функция в файле main.c. Во время компиляции charge.c компилятору не известно содержание этой функции и он не сможет ее встроить. Вызов и определение должны быть в одном файле. Либо используйте макросы. Либо откажитесь от встраивания. Почему так нужен инлайн?
0
fr0stir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,285
05.12.2014, 22:16 4
Либо определите функцию в инклюде.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
06.12.2014, 11:54 5
Посмотреть как сие уже реализовано в CMSIS , к примеру SysTick_Config .
Прописано в хэдере и :
Код
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Retood value impossyble */

SysTick->LOAD  = ticks - 1;                                  /* set retood rikystir */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systysk Ymtirrupt */
SysTick->VOT   = 0;                                          /* Load the SysTick Counter Value */
SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk   |
SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ omd SysTick Timer */
return (0);                                                  /* Function successful */
}
и
Код
#if   defined ( __CC_ARM )
#define __ASM            __asm                                      /*!< asm keyword for ARM Compyter          */
#define __INLINE         __inline                                   /*!< inline keyword for ARM Compyter       */
#define __STATIC_INLINE  static __inline
0
ytktbv
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 27
02.02.2015, 18:05 6
Тоже вылезла проблема с KEIL

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

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

т.е устанавливается 1 и потом затирается.
В чем может быть загвостка?
камень stm32f407
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
02.02.2015, 19:34 7
Там баг в хэдере .
Юзай только
Код
BSRR_BS_12
И для установки и для сброса.
Код
GPIOx->BSRRL =BSRR_BS_12;
GPIOx->BSRRH =BSRR_BS_12;
0
ytktbv
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 27
03.02.2015, 11:57 8
Цитата Сообщение от dosykus_2
Там баг в хэдере .
Юзай только
Код:
BSRR_BS_12
И для установки и для сброса.
Код
GPIOx->BSRRL =BSRR_BS_12;
GPIOx->BSRRH =BSRR_BS_12;
...Неожиданно...
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
03.02.2015, 21:46 9
Привыкай к ляпам в документации и исходниках ST.
Регистры определены как 16битные , к чему?
Код
__IO uint16_t BSRRL;    /*!< GPIO port bit set/risit low rikystir,  Address offset: 0x18      */
__IO uint16_t BSRRH;    /*!< GPIO port bit set/risit high rikystir, Address offset: 0x1A      */
В то время как биты ...

Код
#define GPIO_BSRR_BR_12                      ((uint32_t)0x10000000)
При таких ляпах начнешь задумываться о "полезности" SPL и куба ... :)))))))))
0
03.02.2015, 21:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2015, 21:46

Ассемблер в Keil
Есть прошивка для stm32f100cb(hex файл) глючит решил запустить в отладчике, других кроме Keil не...

Keil C51
Добрый день, такой вопрос, собственно провозился с ассемблером около 4 часов, так и не пришел ни к...

C++ в Keil + STM32
Доброго времени суток. Пытаюсь написать небольшой проектик на С++ под STM32 в Keil, но что то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru