|
Стек для прерываний, и недостаток таймеров |
|
|
|
Jul 26 2009, 20:51
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Кто нибудь делал отдельный стек для прерываний? есть ли смысл? код думаю писать как то так, Код handler: sts stack-0, r16 sts stack-1, r17 in r16, __SP_L_ in r17, __SP_H_ sts stack-2, r16 sts stack-3, r17 ldi r16, lo8(stack-4) ldi r17, hi8(stack-4) out __SP_L__, r16 out __SP_H__, r17 //здесь код обработчика прерывания // востановление писать лень ) тут все понятно reti_ Не слишком ли будет тяжеловесно? хотя это не главный вопрос, основная сложность с компилятором (GCC) как его заставить генерировать обработчтки в таком виде? можно __attribute__ ((__naked__)) но тогда надо как то следить за тем какие регистры были использованы, не сохранять же все. Похоже надо начинать смотреть исходники GCC. Правка: push/pop и st/ld длятся все по 2 такта, можно просто заменить все push на sts с фиксированными адресами ... потерь в скорости не будет.
Сообщение отредактировал amaora - Jul 26 2009, 21:17
|
|
|
|
|
 |
Ответов
|
Jul 27 2009, 16:54
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(amaora @ Jul 27 2009, 18:56)  А вот генерацию пролога/эпилога прерываний придется похоже выполнять с помощью скриптов Имхо, это шаг в сторону. Жизнеспособны в этом случае только варианты написания прерываний либо на чистом Си, либо на чистом асме. Остальное - полумеры, рано или поздно кривизна такого подхода себя обнаружит. Цитата По поводу кооперативной многозадачности Например, так Код void system (int priority) { switch(priority) { case 0: task0(); case 1: task1(); task2(); case 2: task3(); } } /*........................*/ void task0(void) { if(!data_ready()) system(1); /*............*/ } int main(void) { while(1) system(0); return 0; } ЗЫ: при невозможности разрулить приоритетами мютексы проще встраивать в саму задачу.
|
|
|
|
Сообщений в этой теме
amaora Стек для прерываний, и недостаток таймеров Jul 26 2009, 20:51 aaarrr Цитата(amaora @ Jul 27 2009, 00:51) есть ... Jul 26 2009, 20:55 amaora И вопрос второй, в atmega16 три таймера, а что есл... Jul 26 2009, 20:58 aaarrr Цитата(amaora @ Jul 27 2009, 00:58) А над... Jul 26 2009, 21:19 defunct Цитата(amaora @ Jul 26 2009, 23:58) А над... Jul 26 2009, 22:01  Zlumd Цитата(defunct @ Jul 27 2009, 05:01) Возь... Jul 27 2009, 09:35   defunct Цитата(Zlumd @ Jul 27 2009, 12:35) А разв... Jul 27 2009, 11:01    prottoss Цитата(defunct @ Jul 27 2009, 19:01) Не п... Jul 27 2009, 14:39     defunct Цитата(prottoss @ Jul 27 2009, 17:39) Кла... Jul 27 2009, 15:00    Zlumd Цитата(defunct @ Jul 27 2009, 18:01) Да. ... Jul 28 2009, 01:05     defunct Цитата(Zlumd @ Jul 28 2009, 04:05) Так эт... Jul 28 2009, 01:33      _Pasha Цитата(defunct @ Jul 28 2009, 04:33) Дайт... Jul 28 2009, 01:55      Zlumd Цитата(defunct @ Jul 28 2009, 08:33) Как ... Jul 28 2009, 06:01       defunct Цитата(Zlumd @ Jul 28 2009, 09:01) Так оч... Jul 28 2009, 23:02 prottoss Цитата(amaora @ Jul 27 2009, 04:58) И воп... Jul 27 2009, 07:49  SasaVitebsk Цитата(prottoss @ Jul 27 2009, 10:49) Я б... Jul 27 2009, 10:04 _Pasha Цитата(amaora @ Jul 26 2009, 23:51) Кто н... Jul 27 2009, 05:47  amaora Цитата(_Pasha @ Jul 27 2009, 20:54) Имхо,... Jul 28 2009, 07:43   _Pasha Цитата(amaora @ Jul 28 2009, 10:43) С эти... Jul 29 2009, 10:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|