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

|
И вопрос второй, в atmega16 три таймера, а что если надо больше? нулевой занят планировщиком для прееключения задач, первый планирую для ШИМ, второй для часов с отдельным 32.768 кГц резонатором. А надо вот ещё опрашивать небольшую клавиатуру с частотой от 60..120 Гц. Что можно сделать? сменить MCU не вариант. Цитата(aaarrr @ Jul 27 2009, 00:55)  Вот на этот вопрос Вам и надо сначала найти ответ. Я лично не вижу ни малейшего смысла. Не хочется держать на стеке каждой задачи пустое место размером ~20 байт. Пока сложно сказать хватит ли 1кб на все.
Сообщение отредактировал amaora - Jul 26 2009, 20:59
|
|
|
|
|
Jul 27 2009, 09:35
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057

|
Цитата(defunct @ Jul 27 2009, 05:01)  Возьмите за основу кооперативную ОС, - один общий стек на все задачи и прерывания. А разве в кооперативной ОС один стек на все задачи? Насколько я понимаю, кооперативная ОС отличается от некооперативной тем, что в первом случае, задача сама решает, когда передать управление другой задаче, а во втором - ОС насильно прерывает одну задачу и передает управление другой. Или я ошибаюсь в терминологии?
|
|
|
|
Сообщений в этой теме
amaora Стек для прерываний, и недостаток таймеров Jul 26 2009, 20:51 aaarrr Цитата(amaora @ Jul 27 2009, 00:51) есть ... Jul 26 2009, 20:55 aaarrr Цитата(amaora @ Jul 27 2009, 00:58) А над... Jul 26 2009, 21:19   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 Хорошо, с клавиатурой ясно, надо как то усложнить ... Jul 27 2009, 15:56 _Pasha Цитата(amaora @ Jul 27 2009, 18:56) А вот... Jul 27 2009, 16:54  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
|
|
|