|
варнинг Keil c99 |
|
|
|
Feb 3 2015, 20:45
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Метценгерштейн @ Feb 3 2015, 22:08)  А если хочу на С99 писать? Никак что ли? Это же не решение. Если писать, то писать. А если использовать пример, то это другое. Я ничего криминального не увидел. Ассемблерная функция вот так у меня работает. С99, естественно. Код __asm void HardFault_Handler(void) { TST LR, #4 ITE EQ MRSEQ R0, MSP ; Main Stack was used, put MSP in R0 MRSNE R0, PSP ; Process Stack was used, put PSP in R0 LDR R0, [R0, #24] ; Get stacked PC from stack
LDR R1, =0x40020418 ; GPIOB->BSRR MOVS R2, #0x0002 ; Bit 2 STRH R2, [R1, #2] ; Reset bit (LED_ON) B . } Только ссылка на нее идет из стартап-файла, тоже ассемблерного.
|
|
|
|
|
Feb 4 2015, 06:57
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
 вот что пишет на варнинг логика такая- вызывается ф-я nrf_delay_us(999); Код #include <stdio.h> #include "compiler_abstraction.h" #include "nrf.h" #include "nrf_delay.h"
/*lint --e{438} "Variable not used" */ void nrf_delay_ms(uint32_t volatile number_of_ms) { while(number_of_ms != 0) { number_of_ms--; nrf_delay_us(999); } } ее прототип есть в хидере, что #include "nrf_delay.h" так что- прототип как бы есть. а вот в самом хидере уже на нее выскакивет варнинг Код static __ASM void __INLINE nrf_delay_us(uint32_t volatile number_of_us) { loop SUBS R0, R0, #1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP BNE loop BX LR } фото варнинга  так что что-то объявление в ф-ии ему не нравится.
|
|
|
|
|
Feb 4 2015, 07:06
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Метценгерштейн @ Feb 4 2015, 09:57)  так что что-то объявление в ф-ии ему не нравится. Либо __ASM, либо __INLINE не определены (либо оба). Ищите, где они определяются, и добавьте соотв. хидер перед этим хидером. Либо замените их __asm и __inline (маленькими буквами). Либо сами напишите в начале файла #define __ASM __asm #define __INLINE __inline
|
|
|
|
|
Feb 4 2015, 09:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Цитата(andrew_b @ Feb 4 2015, 11:39)  Можно. Но если этот хидер будет включён несколько раз, то вы получите несколько таких функций. Линкер увидит такое и будет орать благим матом. Поэтому функции в хидерах должны обязательно объявляться как static. да, такие грабли возможны. А static как поможет? Я включаю файл хидера в .с файл. Обращаюсь к некой ф-ии в нем. И как тут компилятор узнает, что я обращаюсь к ф-ии именно данного включенного хидера? Получается, что static говорит, что только к локальной ф-ии в этом файле я могу обратиться? Только внутри самого .с ?
|
|
|
|
|
Feb 4 2015, 17:00
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Opex @ Feb 4 2015, 19:20)  If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears;
Ну тем паче, такое можно сделать только, разместив ее в хидере. В общем, это факт, что инлайн-функции, которые могут быть использованы в нескольких файлах, всегда определяются в хидерах.
|
|
|
|
|
Feb 4 2015, 17:51
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Opex @ Feb 4 2015, 20:18)  Попробовал для интереса, можно и в C-файле определить, работает. Конечно, можно, так и делают, если она "местная", нигде больше не нужная. И, вообще, какая разница - если хидер включается еще на этапе препроцессора, и становится единым целым с файлом.
|
|
|
|
|
Feb 4 2015, 17:55
|
Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574

|
Цитата(SM @ Feb 4 2015, 22:51)  Конечно, можно, так и делают, если она "местная", нигде больше не нужная. И, вообще, какая разница - если хидер включается еще на этапе препроцессора, и становится единым целым с файлом. Я неточно выразился, в отдельном C-файле. А использовал ее в другом.
|
|
|
|
|
Feb 5 2015, 09:20
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Opex @ Feb 5 2015, 12:08)  Выходит, что определение inline функции в h-файле - то же самое, что объявление extern inline h-файле и определение в с-файле. Добавление static к функции делает статическую переменную локальной. Нельзя определить inline функцию без ее тела - это противоречит самой сущности inline. Без наличия в файле (и всех включенных хидерах) определения тела такой функции, компилятор, если он реально делает инлайн, а не игнорирует его, должен по идее как-то ругнуться. То есть, определение extern inline без определения тела ф-ции это пустой бред - откуда компилятор возьмет тело функции, чтобы его встроить в место ее вызова?
|
|
|
|
|
Feb 5 2015, 09:54
|
Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574

|
Вот нашел еще: http://stackoverflow.com/questions/216510/...e/216546#216546in K&R C or C89, inline was not part of the language. Many compilers implemented it as an extension, but there were no defined semantics regarding how it worked. GCC was among the first to implement inlining, and introduced the "inline", "static inline", and "extern inline" constructs; most pre-C99 compiler generally follow its lead. GNU89: "inline": the function may be inlined (it's just a hint though). An out-of-line version is always emitted and externally visible. Hence you can only have such an inline defined in one compilation unit, and every other one needs to see it as an out-of-line function (or you'll get duplicate symbols at link time). "static inline" will not generate a externally visible out-of-line version, though it might generate a file static one. The one-definition rule does not apply, since there is never an emitted external symbol nor a call to one. "extern inline" will not generate an out-of-line version, but might call one (which you therefore must define in some other compilation unit. The one-definition rule applies, though; the out-of-line version must have the same code as the inline offered here, in case the compiler calls that instead. C99 (or GNU99): "inline": like GNU "extern inline"; no externally visible function is emitted, but one might be called and so must exist "extern inline": like GNU "inline": externally visible code is emitted, so at most one translation unit can use this. "static inline": like GNU "static inline". This is the only portable one between gnu89 and c99
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|