реклама на сайте
подробности

 
 
> Переключение задач на STM32f10x в Keil
Omnicake
сообщение May 7 2014, 02:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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, мне это не поможет, потому что после выхода оно все равно сбросится на то значение, которое было до входа в прерывание? В общем, возможно, вопросы глупые, но сам до додуматься до решения пока не могуЮ потому прошу совета. Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Omnicake
сообщение May 8 2014, 02:34
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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 снова переписалось на то значение, которое было до прерывания? И получится что указатель стэка не изменился.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016