|
Переключение задач на STM32f10x в Keil |
|
|
|
May 7 2014, 02:17
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002

|
Здравствуйте, пытаюсь сделать простейший переключатель задач на миксе ассемблера и си, используя микропроцессор STM32f10x и среду Keil uVision 5, но постоянно натыкаюсь на непонятные моменты. У меня есть основная функция main, из которой инициализируется процессор и включается таймер systick, по прерыванию таймера запускается диспетчер, в котором я хочу сохранить состояние регистров и при выходе выйти уже не на main а на задачу. Задачи оформлены в виде c-файлов task1.c task2.c и.т.д., к каждой задаче прикреплена структура(массив из 8 чисел) в который заносятся данные о статусе программы, ее длительности и значения SP и PC-регистров, а также зарезервирована величина стэка командой int Stack_task1[512];. Под все это дело организован еще один массив с указателем на массивы каждой из задач. В теории, при инициализации я должен загрузить в массив для каждой задачи значения SP и PC регистров, чтобы после сохранения/восстановления регистров загрузить в регистры SP и PC числа из массива и командой BX выйти на задачу, до следующего срабатывания таймера. Однако здесь у меня возник вопрос: как мне узнать значения регистров SP и PC для каждой задачи, если она нигде не запускается? То есть она просто прикреплена к проекту, на нее ссылается массив но при выполнении программы она не выполняется нигде. ТАкже мне известно, что у STM32 два SP регистра, один из которых работает в прерывании, а другой в главной программе. Получается если я перед самым выходом из прерывания изменю значение SP, мне это не поможет, потому что после выхода оно все равно сбросится на то значение, которое было до входа в прерывание? В общем, возможно, вопросы глупые, но сам до додуматься до решения пока не могуЮ потому прошу совета. Заранее спасибо.
|
|
|
|
|
 |
Ответов
|
May 8 2014, 02:34
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002

|
Прочитал в книге "Джозеф Ю. Ядро Cortex-M3 компании ARM" (спасибо кстати тому, кто посоветовал) по поводу прерывания PendSV, и меня смутило что он ждет завершения обработки других прерываний, хотя по идее в ОС реального времени они бывают иногда запрещены. В то время systick делает на мой взгляд то, что нужно: запускается программа -> выполняет несколько шагов -> приходит исключение от systick -> сохраняется контекст -> запускается диспетчер, который определяет переключать или не переключать задачу -> задача переключается/не переключается -> контекст восстанавливается. В итоге в голове у меня сложилась такая схема того, что мне нужно сделать: 1) В начале инициализации главной подпрограммы main в дескрипторы каждой из задача должны быть загружены значения sp для каждой свой, и значения pc - которое нужно брать от метки каждой из задач. 2) При срабатывании исключения от таймера systick я должен дополнительно сохранить те регистры, которые автоматически не сохраняются и запустить алгоритм, определяющий текущий статус выполнения программы. Который при этом будет опираться на указатель первой задачи в списке дескрипторов. 3) В случае переключения я должен изменить указатель дескрипторов на следующую задачу, сместив его на 32 бита. 4) По окончанию всех операций в диспетчере восстановить состояние регистров, которые не восстанавливаются, выгрузить из дескриптора значения PC и SP и прыгнуть по адресу в PC регистре (то есть на задачу). Однако не получится ли так, что несмотря на то, что я выгрузил значения SP для задачи а потом, выйдя из прерывания, SP снова переписалось на то значение, которое было до прерывания? И получится что указатель стэка не изменился.
|
|
|
|
Сообщений в этой теме
Omnicake Переключение задач на STM32f10x в Keil May 7 2014, 02:17 Golikov A. вроде как при написании диспетчера из прерывания н... May 7 2014, 04:54 jcxz Цитата(Golikov A. @ May 7 2014, 10:54) вр... May 7 2014, 06:11 Forger Цитата(Omnicake @ May 7 2014, 06:17) Здра... May 7 2014, 05:48 RabidRabbit Цитата(Omnicake @ May 7 2014, 06:17) Одна... May 7 2014, 06:54 adnega Я бы посоветовал почитать "Джозеф Ю. Ядро Cor... May 7 2014, 07:49 Golikov A. ЦитатаВ реале - не совсем так.
ну то есть в реальн... May 7 2014, 07:53 jcxz Цитата(Golikov A. @ May 7 2014, 13:53) ну... May 7 2014, 08:50 Omnicake Если честно, разработка диспетчера (то самое изобр... May 7 2014, 08:52 jcxz Так Вас и тут никуда дальше мануалов не посылали. ... May 7 2014, 09:08 Forger Цитата(Omnicake @ May 7 2014, 12:52) Если... May 7 2014, 09:25 Omnicake Хорошо, буду искать. Спасибо. Хотя мне казалось чт... May 7 2014, 09:13 jcxz Цитата(Omnicake @ May 7 2014, 15:13) Хоро... May 7 2014, 09:44  RabidRabbit Цитата(jcxz @ May 7 2014, 13:44) В прерыв... May 7 2014, 09:54 Omnicake Я скачал исходники FreeRTOS и первое на что обрати... May 7 2014, 09:50 jcxz Цитата(Omnicake @ May 7 2014, 15:50) Я ск... May 7 2014, 10:15 Forger Цитата(Omnicake @ May 7 2014, 13:50) Я ск... May 7 2014, 10:30 Golikov A. С Си на Асм перейти правда 5 копеек задача, компил... May 7 2014, 19:25 _Артём_ Цитата(Golikov A. @ May 7 2014, 23:25) Ед... May 7 2014, 21:07 jcxz Цитата(Golikov A. @ May 8 2014, 01:25) Ед... May 8 2014, 03:03 Omnicake А я как раз должен разработать систему, где у зада... May 8 2014, 03:25 jcxz Цитата(Omnicake @ May 8 2014, 09:25) А я ... May 8 2014, 04:54 Omnicake У меня в дескрипторе есть строчка Status которая м... May 8 2014, 05:06 Golikov A. А... понял где заблуждался. В моей модели реально ... May 8 2014, 05:07 jcxz Цитата(Golikov A. @ May 8 2014, 11:07) та... May 8 2014, 06:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|