|
|
  |
Как в модуле Си увидеть функцию, объявленную в другом |
|
|
|
Jun 17 2013, 07:25
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797

|
Цитата(Сергей Борщ @ Jun 17 2013, 10:36)  Отсюда следует вывод - для передачи данных из вашего, пользовательского кода предусмотрена другая функция. Не предусмотрена. Этот пример - банальный переходник USB-UART. Указанная функция вызывается из прерывания по RXNE и берет данные из UART, что бы передавать ей свои данные ее нужно слегка переписать.
|
|
|
|
|
Jun 17 2013, 08:04
|

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

|
QUOTE (Flexz @ Jun 17 2013, 10:25)  Не предусмотрена. ... чтобы передавать ей свои данные ее нужно слегка переписать. Значит это пример того, как не надо писать программы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 19 2013, 04:31
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
Я далеко не специалист в программировании, и не особо настаиваю на правильности того, что написал. Может, это совсем неправильно с точки зрения программирования на Си. Просто на практике так сделал - и заработало, без сбоев и тормозов. Сведения же я взял так : набрал в яндексе "static в си" и первая ссылка оказалась helloworld.ru›texts/comp/lang/c/c/h16.htm . Там и прочитал следующее : "Спецификатор класса памяти в объявлении переменной может быть auto, register, static или extern. Если класс памяти не указан, то он определяется по умолчанию из контекста объявления. " и далее "При объявлении переменной на внутреннем уровне может быть использован любой из четырех спецификаторов класса памяти, а если он не указан, то подразумевается класс памяти auto. "
|
|
|
|
|
Jun 19 2013, 08:38
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(NikP @ Jun 18 2013, 21:13)  переопределил VCP_DataTx() как extern (вместо static) в модуле usbd_cdc_vcp.c , и всё прекрасно увиделось из модуля app.c ( из main). Если автор программы определил в модуле функцию как static, это значит, что он не предполагал, что этой функцией будут пользоваться снаружи модуля. Когда вы сделали ее extern, до нее стало можно добраться и снаружи, но намерения первоначального автора модуля при этом не изменились Так что позвать вы ее (функцию) теперь можете, но последствия этого вызова целиком на вашей совести. Яркий пример - вы вытащили наружу функцию, которая работает с регистрами какого то аппаратного модуля и вызывается только из прерываний. Вызов этой функции снаружи (не из прерывания) может нарушить работу этого самого модуля, если в процессе ее вызова произойдет прерывание, и обработчик снова позовет эту функцию.
|
|
|
|
|
Jun 19 2013, 10:38
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
Цитата(XVR @ Jun 19 2013, 12:38)  Яркий пример - вы вытащили наружу функцию, которая работает с регистрами какого то аппаратного модуля и вызывается только из прерываний. Точно, на такие грабли я уже наступал. Спасибо за напоминание.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|