Перейти к содержанию
    

LwIP, FreeRTOS, STM32F207

Есть такой пример подключения LwIP http://www.st.com/st-web-ui/static/active/...sw-stm32060.zip

Открываю его под IAR. Пример, в принципе, работает. Однако, такое впечатление, что вопреки, а не благодаря. Но возможно, я чего-то недопонимаю.

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

main.c

...
int main(void)
{
...
  /* configure Ethernet (GPIOs, clocks, MAC, DMA) */ 
  ETH_BSP_Config();
    
  /* Initilaize the LwIP stack */
  LwIP_Init();
  
  /* Initialize webserver demo */
  http_server_netconn_init();

....
}

Соответственно в stm32f2x7_eth_bsp.c

...
void ETH_BSP_Config(void)
{
  /* Configure the GPIO ports for ethernet pins */
  ETH_GPIO_Config();
  
  /* Config NVIC for Ethernet */
  ETH_NVIC_Config();

  /* Configure the Ethernet MAC/DMA */
  ETH_MACDMA_Config();
....
}
...
void ETH_NVIC_Config(void)
{
  NVIC_InitTypeDef   NVIC_InitStructure;

  /* 2 bit for pre-emption priority, 2 bits for subpriority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
  
  /* Enable the Ethernet global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);    
}
...

Вроде как разрешили прерывание по эзернету

Однако открываю startup_stm32f2xx.s и вижу, что ETH_IRQHandler обслуживается внутренней заглушкой

Попытки найти альтернативный обработчик прерывания в остальном коде примера не дали результата.

 

Беру пример FreeRTOS 8.2.0. В нем, к сожалению, нет примера под IAR на STM32 Cortex и LwIP, но есть STM32F107 под GCC. В нем в STM32F10x_Startup.s отчетливо прописано

.extern xPortPendSVHandler
.extern xPortSysTickHandler
.extern vPortSVCHandler
.extern vMAC_ISR;

Т.е. обслуживание прерывания есть. Как же пример от ST то работает?

Изменено пользователем Мусатов Константин

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попытки найти альтернативный обработчик прерывания в остальном коде примера не дали результата.

ETH_IRQHandler находится в stm32f2xx_it.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ETH_IRQHandler находится в stm32f2xx_it.c

Но почему он не объявлен как .EXTERN в стартапе и оставлена путая заглушка. Мне кажется, с точки зрения языка, он не должен использовать внешнюю ссылку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В стартапе заглушка объявлена как weak, соответственно, будет заменена при линковке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поскольку приход и отправка данных по Ethernet асинхронное событие, то логично работать через прерывание.

Не обязательно. У меня всё сделано по схеме Super Loop. Нормально работает. Не зря же Ethernet MAC умеет накапливать принятые кадры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В стартапе заглушка объявлена как weak, соответственно, будет заменена при линковке.

Понял. Ой не люблю такие неявные вещи. Гораздо понятнее прямое определение. Вопрос закрыт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...