LINUX.ORG.RU

Не вызывается внешняя функция в таймере

 


1

1

Всем привет. Пишу 2 модуля. В 1-м модуле определена функция uptime, какая по вызову обновляет переменную hello_str. Следующим образом:

static char *hello_str = "Uptime\n";

extern void*  uptime( void );
EXPORT_SYMBOL( uptime );

extern void* uptime( void ){
  strcpy(hello_str, "Uptime\n");
}

Во 2-м модуле, реализуется таймер, какому надо указать ссылку на функцию, вызываемую по сработке.

extern void* uptime (void);

static void timer_callback( unsigned long data)
{
 int ret;
   uptime();
   ret = mod_timer( &my_timer, jiffies + usecs_to_jiffies( 3 ) );
   return;
}

Однако, после установки 2-го модуля (при попытке вызвать внешнюю функцию uptime), система виснет. Где я накосячил и как заставить работать по таймеру uptime?


Ответ на: комментарий от tailgunner

Немного переписал. Но, на самом деле strcpy как-то не корректно работает. А как тогда строку присвоить переменной?

gr1047
() автор топика
Ответ на: комментарий от gr1047

Но, на самом деле strcpy как-то не корректно работает.

На самом деле, ты просто не понимаешь, что делаешь.

А как тогда строку присвоить переменной?

Мне кажется, ты не знаешь Си. Начни с с учебника по нему.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Не корректно передаётся переменная hello_str

В общем, я переписал немного, и сейчас внешней стала не функция, а переменная hello_str. Однако, она как-то не правильно передаётся. В модуле 1:

  extern char* hello_str;
  EXPORT_SYMBOL ( hello_str  );
  char* hello_str = "Uptime";

В модуле 2, вот так работает:

 extern char* hello_str;

 static void timer_callback( unsigned long data){
   hello_str=0;}

а вот так виснет:

 extern char* hello_str;
 static void timer_callback( unsigned long data){
   hello_str[0]='U';
   hello_str[1]=0;}

Что не так?

gr1047
() автор топика
Ответ на: комментарий от tailgunner

Согласен. У меня только в этом месте затык. Всё остальное вроде работает. Сдать надо завтра. Учебники однозначно да. Но позже.

gr1047
() автор топика

static char *hello_str = «Uptime\n»;

Не знаю как в модулях, но обычно должно быть static char hello_str[] = «Uptime\n»;

deadskif
()
Ответ на: комментарий от deadskif

При этом, в коде таймера, переменная видится. Но занести в неё не получается. Т.е. вот-так всё работает.

 printk(hello_str);

gr1047
() автор топика
Ответ на: комментарий от gr1047
char *hello_str = "OLOLO"; /* Это указатель на константную строку, которая находится в области памяти только для чтения */
char hello_str[] = "OLOLO"; /* Это массив байт в памяти, доступной и для записи */

В ядреном коде могут быть особенности, но скорее всего +- тоже самое.

Мне кажется, ты не знаешь Си. Начни с с учебника по нему.

+1

deadskif
()
Ответ на: комментарий от deadskif

Спасибо за науку, буду знать. На си я пишу. Но для контроллеров. Там всё гораздо проще. Там таких конструкций с экстернами нет. Они там ни к чему. Потому и обратился к коллективному разуму. Сейчас попробую. Отпишусь. Может кому эти грабли ещё понадобятся.

gr1047
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.