реклама на сайте
подробности

 
 
> Прототип обработчика прерывания, попробовал воспользоваться --require_prototypes
aspID
сообщение May 23 2012, 07:51
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Решил попробовать воспользоваться параметром --require_prototypes и понял, что не знаю, как правильно работать с обработчиками прерываний.

Что должно выноситься в заголовочный файл, а что быть только в .c-файле? Как правильно описать прототип функции-обработчика прерывания?

На форуме пытался найти ответ на этот вопрос, но видимо, не умею правильно его задать.

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alexeyv
сообщение May 24 2012, 03:25
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Прототип функции - это объявление функции перед ее вызовом, для того чтобы компилятор мог правильно проверить типы параметров и возвращаемого значения функции. Обычно записывается в *.h и подключается include'ом в начале *.c-файла в котором используется, но можно указать и явно в начале файла:
Код
#include <stdio.h>
int power(int m, int n);
/* тестирование power - функции возведения в степень */
main()
{
int i;
for (i = 0; i < 10; ++i)
printf("%d %d %d\n", i, power(2,i), power(-3,i));
return 0;
}
/* power: возводит base в п-ю степень; n >= 0 */
int power(int base, int n)
{
int i, p;
P = 1;
for (i = 1; i <= n; ++i)
p = p * base;
return p;
}


Перед функцией main можно заметить такую строку:
Код
int power(int m, int n);

Она сообщает, что power является функцией с двумя аргументами типа int, возвращающей также значение типа int. Эта декларация называется прототипом функции и обязана согласовываться по форме как с определением (заголовком) функции power, так и с любыми ее вызовами. Если определение функции отличается от ее прототипа или формы вызова, возникает ошибка.

Имена параметров согласовывать не обязательно. Вообще-то не обязательно даже указывать имена параметров в прототипе функции, поэтому предыдущий прототип можно было бы записать так:
Код
int power(int, int);

Однако хорошо выбранные имена являются своеобразной документацией к программе, так что они будут часто использоваться.


Опция компилятора --require_prototypes, заставляет в обязательном порядке всем функциям иметь прототипы, иначе он выдаст ошибку

Прототип функции прерывания - как и у всех остальных функций
Код
interrupt void dmaXmtIsr(void); /// <--- прототип функции
.......
void main (void)
{
......
}
......
interrupt void dmaXmtIsr(void)
{
......
.............
}


Подробнее - в книге Керигана/Ричи, откуда и были взяты примеры.

Сообщение отредактировал alexeyv - May 24 2012, 03:27
Go to the top of the page
 
+Quote Post
aspID
сообщение May 26 2012, 06:58
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Цитата(alexeyv @ May 24 2012, 10:25) *
Подробнее - в книге Керигана/Ричи, откуда и были взяты примеры.


За изложение матчасти, конечно, спасибо, может быть, кому-то пригодится... В принципе, о прототипах я и сам могу несколько подробнее рассказать. И --require_prototypes использовал намеренно, в общем-то. Вопрос только был несколько в другом - я не совсем понимаю, как правильно объявить прототип обработчика прерывания. fman.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 26 2012, 08:15
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (aspID @ May 26 2012, 09:58) *
Вопрос только был несколько в другом - я не совсем понимаю, как правильно объявить прототип обработчика прерывания. fman.gif
Пока не признаетесь, какой компилятор используете - никто помочь не сможет. Ибо, как заметил Gorby, прерывания являются расширением компилятора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
aspID
сообщение May 26 2012, 13:03
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Цитата(Сергей Борщ @ May 26 2012, 15:15) *
Пока не признаетесь, какой компилятор используете - никто помочь не сможет. Ибо, как заметил Gorby, прерывания являются расширением компилятора.


ИАР, на данный момент работает так:


Код
#pragma vector=USART0_RX_vect
__interrupt void usart_rx_complete ( void );


...

#pragma vector=USART0_RX_vect
__interrupt void usart_rx_complete ( void )
{
  // If buffer not overflowed
  if ( rbuf_RX.ui_Len < USART_BUF_SIZE )
  {
    rbuf_RX.uc_Data[rbuf_RX.ui_Next] = UDR;
    // Incrementing buffer counters and pointers
    rbuf_RX.ui_Len += 1;
    rbuf_RX.ui_Next += 1;
    // Check for pointer to next is in range
    if ( rbuf_RX.ui_Next == USART_BUF_SIZE )
      rbuf_RX.ui_Next = 0;
    }
}


но это не более, чем эмпирическим путем полученная компиляция без ошибок. Ни подтверждения, ни опровержения правильности такого использования найти не смог.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 05:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016