Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 62

Warning: no previous prototype for function 'EXTI1_IRQHandler' [-Wmissing-prototypes]

10.03.2025, 20:48. Показов 3751. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток
Имеется такой код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "stm32f10x.h"
 
 
void SetSysClockTo72(void);
void PORTC_13_INIT(void);
void PORTC_14_INIT(void);
void PINA_0_INIT(void);
void PINA_1_INIT(void);
void Interrupt_EXTI_PA1_init(void);
 
void EXTI1_IRQHandler()
{
    EXTI->PR |= EXTI_PR_PR1;
    GPIOC->BSRR |= GPIO_BSRR_BR14;
}
 
int main(void)
{
    SetSysClockTo72();
    PORTC_13_INIT();
    PORTC_14_INIT();
    PINA_0_INIT();
    PINA_1_INIT();
    Interrupt_EXTI_PA1_init();
    volatile uint32_t i=0;
    GPIOC->BSRR |= GPIO_BSRR_BS14;
    while(1)
    {
        
        if (READ_BIT(GPIOA->IDR, GPIO_IDR_IDR0) == 0)
        {
            continue;
        }
        
        GPIOC->BSRR |= GPIO_BSRR_BS13;
        i=0;
        while(i<1000000)
        {
            i++;
        }
        GPIOC->BSRR |= GPIO_BSRR_BR13;
        i=0;
        while(i<1000000)
        {
            i++;
        }
    }
}
 
/*void SetSysClockTo72(void)
{
    RCC->CR |= RCC_CR_HSEON; // включаем внешнее тактирование
    while (READ_BIT(RCC->CR, RCC_CR_HSERDY == RESET)){} // ожидание стабилизации тактирования от HSE
    
    FLASH->ACR &= ~FLASH_ACR_PRFTBE;
    FLASH->ACR |= FLASH_ACR_PRFTBE; 
    FLASH->ACR &= ~FLASH_ACR_LATENCY;
    FLASH->ACR |= FLASH_ACR_LATENCY_2;  
        
    RCC->CFGR &= ~RCC_CFGR_HPRE; // сброс любой предустановленной настройки
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // оставляем частоту SYSCLK без деления
    RCC->CFGR &= ~RCC_CFGR_PPRE2; // сброс любой предустановленной настройки для шины APB2
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; // оставляем частоту SYSCLK шины APB2 без деления
    RCC->CFGR &= ~RCC_CFGR_PPRE1; // сброс любой предустановленной настройки для шины APB1
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // делим частоту SYSCLK шины APB1 на 2
    RCC->CFGR &= (uint32_t)((uint32_t) ~ (RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));// испорльзуем вход мультиплексора HSE
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); // умножаем HSE на 9
    RCC->CR |= RCC_CR_PLLON;// включили ФАПЧ
    while(READ_BIT(RCC->CR, RCC_CR_PLLRDY)!=(RCC_CR_PLLRDY)){} // ожидам пока PLL не разблокируется
    RCC->CFGR &= ~RCC_CFGR_SW;
    RCC->CFGR |= RCC_CFGR_SW_PLL;
    while(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)!=RCC_CFGR_SWS_PLL){}
}*/
 
void SetSysClockTo72(void)
{
    RCC->CR |= RCC_CR_HSEON; // Включаем внешнее тактирование
    while (READ_BIT(RCC->CR, RCC_CR_HSERDY) == RESET) {} // Ожидание стабилизации HSE
 
    FLASH->ACR |= FLASH_ACR_PRFTBE; // Включаем предварительное кэширование
    FLASH->ACR &= ~(unsigned int)FLASH_ACR_LATENCY; // Сбрасываем настройки задержки
    FLASH->ACR |= FLASH_ACR_LATENCY_2; // Устанавливаем задержку на 2 такта (для 72 МГц)
 
    RCC->CFGR &= ~RCC_CFGR_HPRE; // Сбрасываем предделитель для SYSCLK
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // SYSCLK без деления
    RCC->CFGR &= ~RCC_CFGR_PPRE2; // Сбрасываем предделитель для APB2
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; // APB2 без деления
    RCC->CFGR &= ~RCC_CFGR_PPRE1; // Сбрасываем предделитель для APB1
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // APB1 делится на 2
 
    RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL); // Сбрасываем настройки PLL
    RCC->CFGR |= (RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); // Используем HSE и умножаем на 9
 
    RCC->CR |= RCC_CR_PLLON; // Включаем PLL
    while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RCC_CR_PLLRDY) {} // Ожидание готовности PLL
 
    RCC->CFGR &= ~RCC_CFGR_SW; // Сбрасываем выбор источника системных часов
    RCC->CFGR |= RCC_CFGR_SW_PLL; // Выбираем PLL как источник SYSCLK
    while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {} // Ожидание переключения на PLL
}
 
 
void PORTC_13_INIT(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    GPIOC->CRH &= ~GPIO_CRH_MODE13;
    GPIOC->CRH |= GPIO_CRH_MODE13_1;
    GPIOC->CRH &= ~GPIO_CRH_CNF13;
}
 
void PORTC_14_INIT(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    GPIOC->CRH &= ~GPIO_CRH_MODE14;
    GPIOC->CRH |= GPIO_CRH_MODE14_1;
    GPIOC->CRH &= ~GPIO_CRH_CNF14;
}
 
void PINA_0_INIT(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    GPIOA->CRL &= ~GPIO_CRL_MODE0_0;
    GPIOA->CRL &= ~GPIO_CRL_MODE0_1;
    GPIOA->CRL &= ~GPIO_CRL_CNF0_0;
    GPIOA->CRL |= GPIO_CRL_CNF0_1;
    //GPIOA->ODR |= (1 << 0); // Включаем подтягивающий резистор (если требуется)
}
 
void PINA_1_INIT(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    GPIOA->CRL &= ~GPIO_CRL_MODE1_0;
    GPIOA->CRL &= ~GPIO_CRL_MODE1_1;
    GPIOA->CRL &= ~GPIO_CRL_CNF1_0;
    GPIOA->CRL |= GPIO_CRL_CNF1_1;
    GPIOA->BSRR = GPIO_BSRR_BS1; // поддяжка к питанию
}
 
void Interrupt_EXTI_PA1_init(void)
{
    EXTI->PR |= EXTI_PR_PR1;
    EXTI->IMR |= EXTI_IMR_MR1;
    AFIO->EXTICR[1] &= ~(unsigned int)AFIO_EXTICR1_EXTI1_PA;
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    EXTI->FTSR |= EXTI_FTSR_TR1; // прерывание по спаду импульса
    NVIC_EnableIRQ(EXTI1_IRQn);
    NVIC_SetPriority(EXTI1_IRQn, 0);
}
компилятор не понимает что это за функция EXTI1_IRQHandler
выдает предупреждение
main.c(11): warning: no previous prototype for function 'EXTI1_IRQHandler' [-Wmissing-prototypes]
void EXTI1_IRQHandler()
main.c(11): note: declare 'static' if the function is not intended to be used outside of this translation unit
void EXTI1_IRQHandler()
main.c(11): warning: this old-style function definition is not preceded by a prototype [-Wstrict-prototypes]
void EXTI1_IRQHandler()
подскажите как с этим совладать
Проект учебный в Keil5
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2025, 20:48
Ответы с готовыми решениями:

error C2365: 'GetModuleFileNameW': redefinition; previous definition was 'function'
Здравствуйте! При попытке подключить честно найденный код в инете, при помощи которого можно посчитать хэш исполняемого файла, столкнулся...

Function prototype
Все функции наследуются от Function.prototype.Вопрос такой я чет не могу понять откуда идет наследование.Оно идёт не из ссылки proto .А...

Ошибка function should have a prototype
Здравствуйте форумчане. Вот такой вопрос: писала как-то программу на Borland C++. Всё запускалось, прекрасно работало. Скачала полную...

34
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
10.03.2025, 20:59
C
1
void EXTI1_IRQHandler(void)
0
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 62
10.03.2025, 21:44  [ТС]
void не помог
Миниатюры
Warning: no previous prototype for function 'EXTI1_IRQHandler' [-Wmissing-prototypes]  
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
10.03.2025, 22:19
Он жалуется, что прототип для этой функции не объявлен. Выше объявите просто одной строкой
C
1
void EXTI1_IRQHandler();
А что это за компилятор такой? Никогда таких ошибок не видел.
0
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 62
10.03.2025, 22:40  [ТС]
Если я выше объявлю одной строкой то это уже не будет обработчик прерывания. Это будет обычная функция никак не привязанная к NVIC
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
11.03.2025, 00:17
Обработчик прерывания - это и есть обычная функция. Просто на неё будет указывать вектор прерывания.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
11.03.2025, 01:22
Цитата Сообщение от Sergey1985 Посмотреть сообщение
void не помог
Как же не помог?
Раньше был warning о неправильном синтаксисе, теперь всего лишь warning, что функция не используется.
И бинарник для прошивки, кстати, слинкован.

Добавлено через 1 минуту
Цитата Сообщение от Humanoid Посмотреть сообщение
А что это за компилятор такой? Никогда таких ошибок не видел.
Обычный keil, обычный clang.
0
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 62
11.03.2025, 13:40  [ТС]
не знаю чертовщина какая-то. Если кто то знает подскажите ссылку на видео где бы использовалось прерывание с момента запуска keil5. Может что то при создании проекта не то делаю
Миниатюры
Warning: no previous prototype for function 'EXTI1_IRQHandler' [-Wmissing-prototypes]  
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
11.03.2025, 18:28
Sergey1985, добавьте в командную строку компилятора параметр -Wno-missing-variable-declarations и не парьтесь
0
87 / 86 / 4
Регистрация: 20.11.2016
Сообщений: 270
11.03.2025, 19:45
quwy,
-Wno-missing-variable-declarations
А что делает этот параметр и где про него прочитать можно?
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
11.03.2025, 20:02
Вместе с -Wno-missing-prototypes подавляет ваши ворнинги.

Кстати, static перед декларацией тоже помогает.
1
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 62
11.03.2025, 21:10  [ТС]
Цитата Сообщение от quwy Посмотреть сообщение
Sergey1985, добавьте в командную строку компилятора параметр -Wno-missing-variable-declarations и не парьтесь
работаю в keil5
как это сделать?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.03.2025, 21:32
Цитата Сообщение от quwy Посмотреть сообщение
Кстати, static перед декларацией тоже помогает.
А потом не будет вопросов вида "а почему обработчик прерывания не отрабатывает?"
Самому просто интересно, какая у них сигнатура должна быть...
Чтобы link-ер из бинарника "неиспользуемые" функции не выкидывал....
0
1474 / 489 / 72
Регистрация: 22.09.2023
Сообщений: 1,499
12.03.2025, 10:39
Цитата Сообщение от Max Dark Посмотреть сообщение
А потом не будет вопросов вида "а почему обработчик прерывания не отрабатывает?"
Естественно будут. Ибо статическая функция не видна за пределами единицы трансляции и ее адрес не сможет попасть в вектор обработчика прерывания.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
12.03.2025, 10:56
Цитата Сообщение от Sergey1985 Посмотреть сообщение
компилятор не понимает что это за функция EXTI1_IRQHandler
gcc собирает нормально. Пришлось, конечно, кое-что подправить, но совсем мелочи. И даже, похоже, правильно располагает адрес в таблице векторов.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
12.03.2025, 11:11
Есть такой стандарт - MISRA
С ним не знаком, но предполагаю, что это предупреждение входит в этот набор проверок.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
12.03.2025, 15:24
Цитата Сообщение от Dushevny Посмотреть сообщение
Ибо статическая функция не видна за пределами единицы трансляции и ее адрес не сможет попасть в вектор обработчика прерывания
Спорное утверждение. У статической функции есть адрес, и значит в таблицу векторов он попасть может.

Другой вопрос как это устроено в данном конкретном компиляторе/линкере. Учитывая общий идиотизм назначения обработчиков прерываний согласно шаблонам имен функций, может быть статическую функцию линкер и не найдет.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
12.03.2025, 17:10
Цитата Сообщение от quwy Посмотреть сообщение
Учитывая общий идиотизм назначения обработчиков прерываний согласно шаблонам имен функций
У ARM вроде(stm32 точно) бы массив с адресами в начало Flash записать нужно.
В RISC-V специальными командами ассемблера обработчики устанваливаются, а запускается прыжком в начало флешки.

Никто не говорит, как именно они должны называтся.

Это уже разработчики обвязок позаботились, написав и стартовые файлы(с таблицей прерываний, в которой имена поумолчанию заданы) и скрипты компоновщика.
А так - для самообразования - можно самостоятельно и startup.S с link.ld написать.
Довольно познавательно.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
12.03.2025, 17:50
Цитата Сообщение от Max Dark Посмотреть сообщение
У ARM вроде(stm32 точно) бы массив с адресами в начало Flash записать нужно.
Так почему бы не делать это явно? Нафига было вот это EXTI1_IRQHandler прибивать гвоздями к одному из векторов?

Напоминает подход ардуинщиков, когда магия компилятора и библиотек настолько скрывает смысл происходящего, что это ведет к глупейшим ошибкам.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
12.03.2025, 17:58
Цитата Сообщение от quwy Посмотреть сообщение
Так почему бы не делать это явно?
Вы можете сделать это самостоятельно.
Цитата Сообщение от quwy Посмотреть сообщение
было вот это EXTI1_IRQHandler прибивать гвоздями к одному из векторов?
Может потому, что это обработчик прерывания EXTI1?

Это просто шаблон, на основе которого генерируется болванка для проекта.
Галочками в UI нужные фичи включить и т.д...
Отладили один раз и используют.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2025, 17:58
Помогаю со студенческими работами здесь

Function 'CharToOem' should have a prototype
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include&lt;iomanip.h&gt; char NEWT; char*RUS(char*TEXT) { ...

Ошибка Function 'rand' should have a prototype
#include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; main() { int i=0; float a,s=0,b=0.9,c,w; clrscr(); ...

Prototype Typeerror: document.getElementByid is not a function
Проверял сайт на локальном сервере. Консоль Мозиллы выдает ошибку. typeerror: document.getelementbyid is not a function. Как быть? Из-за...

как исправить Function 'sewt' should have a prototype
Даны вещественные массивы A, B. Определить значения вещественного массива C по правилу: C = сумме i-й строки массива A при B&gt;0 C=0...

Как исправить ошибку: function 'logf' should have a prototype
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; float ver = {0.4f, 0.2f, 0.1f, 0.05f, 0.05f, 0.05f, 0.05f, 0.04f, 0.03f,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru