2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 57
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток
Имеется такой код
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++. Всё запускалось, прекрасно работало. Скачала полную...

32
Native x86
Эксперт Hardware
 Аватар для quwy
6435 / 3539 / 992
Регистрация: 13.02.2013
Сообщений: 11,209
10.03.2025, 20:59 2
C
1
void EXTI1_IRQHandler(void)
0
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 57
10.03.2025, 21:44  [ТС] 3
void не помог
Миниатюры
Warning: no previous prototype for function 'EXTI1_IRQHandler' [-Wmissing-prototypes]  
0
Почетный модератор
 Аватар для Humanoid
11538 / 4333 / 450
Регистрация: 12.06.2008
Сообщений: 12,441
10.03.2025, 22:19 4
Он жалуется, что прототип для этой функции не объявлен. Выше объявите просто одной строкой
C
1
void EXTI1_IRQHandler();
А что это за компилятор такой? Никогда таких ошибок не видел.
0
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 57
10.03.2025, 22:40  [ТС] 5
Если я выше объявлю одной строкой то это уже не будет обработчик прерывания. Это будет обычная функция никак не привязанная к NVIC
0
Почетный модератор
 Аватар для Humanoid
11538 / 4333 / 450
Регистрация: 12.06.2008
Сообщений: 12,441
11.03.2025, 00:17 6
Обработчик прерывания - это и есть обычная функция. Просто на неё будет указывать вектор прерывания.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6435 / 3539 / 992
Регистрация: 13.02.2013
Сообщений: 11,209
11.03.2025, 01:22 7
Цитата Сообщение от Sergey1985 Посмотреть сообщение
void не помог
Как же не помог?
Раньше был warning о неправильном синтаксисе, теперь всего лишь warning, что функция не используется.
И бинарник для прошивки, кстати, слинкован.

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

Кстати, static перед декларацией тоже помогает.
1
2 / 2 / 1
Регистрация: 16.09.2014
Сообщений: 57
11.03.2025, 21:10  [ТС] 12
Цитата Сообщение от quwy Посмотреть сообщение
Sergey1985, добавьте в командную строку компилятора параметр -Wno-missing-variable-declarations и не парьтесь
работаю в keil5
как это сделать?
0
Диванный эксперт
 Аватар для Max Dark
2335 / 2006 / 961
Регистрация: 09.10.2013
Сообщений: 4,591
Записей в блоге: 4
11.03.2025, 21:32 13
Цитата Сообщение от quwy Посмотреть сообщение
Кстати, static перед декларацией тоже помогает.
А потом не будет вопросов вида "а почему обработчик прерывания не отрабатывает?"
Самому просто интересно, какая у них сигнатура должна быть...
Чтобы link-ер из бинарника "неиспользуемые" функции не выкидывал....
0
931 / 384 / 58
Регистрация: 22.09.2023
Сообщений: 1,125
12.03.2025, 10:39 14
Цитата Сообщение от Max Dark Посмотреть сообщение
А потом не будет вопросов вида "а почему обработчик прерывания не отрабатывает?"
Естественно будут. Ибо статическая функция не видна за пределами единицы трансляции и ее адрес не сможет попасть в вектор обработчика прерывания.
0
 Аватар для COKPOWEHEU
4044 / 2595 / 431
Регистрация: 09.09.2017
Сообщений: 11,556
12.03.2025, 10:56 15
Цитата Сообщение от Sergey1985 Посмотреть сообщение
компилятор не понимает что это за функция EXTI1_IRQHandler
gcc собирает нормально. Пришлось, конечно, кое-что подправить, но совсем мелочи. И даже, похоже, правильно располагает адрес в таблице векторов.
0
Диванный эксперт
 Аватар для Max Dark
2335 / 2006 / 961
Регистрация: 09.10.2013
Сообщений: 4,591
Записей в блоге: 4
12.03.2025, 11:11 16
Есть такой стандарт - MISRA
С ним не знаком, но предполагаю, что это предупреждение входит в этот набор проверок.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6435 / 3539 / 992
Регистрация: 13.02.2013
Сообщений: 11,209
12.03.2025, 15:24 17
Цитата Сообщение от Dushevny Посмотреть сообщение
Ибо статическая функция не видна за пределами единицы трансляции и ее адрес не сможет попасть в вектор обработчика прерывания
Спорное утверждение. У статической функции есть адрес, и значит в таблицу векторов он попасть может.

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

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

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

Напоминает подход ардуинщиков, когда магия компилятора и библиотек настолько скрывает смысл происходящего, что это ведет к глупейшим ошибкам.
0
Диванный эксперт
 Аватар для Max Dark
2335 / 2006 / 961
Регистрация: 09.10.2013
Сообщений: 4,591
Записей в блоге: 4
12.03.2025, 17:58 20
Цитата Сообщение от 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
Создаем микросервисы с NestJS, TCP и Typescript
run.dev 17.03.2025
NestJS — фреймворк, который значительно упрощает создание серверных приложений на Node. js. Его прелесть в том, что он комбинирует концепции ООП, функционального программирования и предлагает. . .
Гексагональная архитектура со Spring Boot
Javaican 17.03.2025
Если вы когда-нибудь сталкивались с ситуацией, когда внесение простых изменений в базу данных или пользовательский интерфейс заставляло вас переписывать весь код, то вы точно оцените элегантность. . .
Позиционировани­е Kafka Consumer и Seek-операции
Javaican 17.03.2025
Что же такое Consumer Seek в Kafka? По сути, это API-метод, который позволяет программно указать, с какой позиции (offset) Consumer должен начать или продолжить чтение данных из партиции. Без этого. . .
Python NumPy: Лучшие практики и примеры
py-thonny 17.03.2025
NumPy (Numerical Python) — одна из ключевых библиотек для научных вычислений в Python. Она превращает Python из просто удобного языка общего назначения в среду для проведения сложных математических. . .
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru