0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
1 | |
вопрос по Di Halt Rtos.17.03.2016, 23:15. Показов 6077. Ответов 9
Метки нет (Все метки)
проц.: atmega8a
os: DiHalt Rtos проблема: незапускается. инициализация проходит и начинается тупить в while(1) не доходя до TaskManager; проект прикладываю. [39.27 Кб]
0
|
17.03.2016, 23:15 | |
Ответы с готовыми решениями:
9
Творческий вопрос! Прерывания в RTOS DI HALT rtos Вопрос по RTOS Вопрос по RTOS atmega8535, RTOS, interrupts, вопрос |
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 24
|
|
17.03.2016, 23:22 | 2 |
может таймер не работает?
я у себя использовал http://we.iosyitistromyss.ru/Soft/dyspe ... tcher.html
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
18.03.2016, 00:08 | 3 |
Сообщение от shytow
на атмеге8 только первый раз запустил.
0
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
|
18.03.2016, 00:16 | 4 |
Код
// Инициализируем ядро InitRTOS; // в файле <EERTOS.c> // Инициализируем внутреннюю периферию контроллера InitOtt; // в файле <HAL.c> // Старт ядра. RunRTOS;
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
18.03.2016, 00:17 | 5 |
ларчик просто открывался.
функции надо вызывать со скобками InitRTOS(); InitOtt(); RunRTOS(); InitLeds(); а не без. InitRTOS; InitOtt; RunRTOS; InitLeds; где угодно. особенно в прерываниях.
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
18.03.2016, 00:18 | 6 |
Сообщение от itysiy
InitRTOS; // в файле <EERTOS.c> // Инициализируем внутреннюю периферию контроллера InitOtt; // в файле <HAL.c> // Старт ядра. RunRTOS; При вызове функций после имени функции нужно обязательно скобки (), иначе это просто указатель. на полминуты опередили) спасибо!) +1 к экспе
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
23.03.2016, 12:14 | 7 |
есть шаговый двигатель. управляется через L293 напрямую с контроллера. то есть каждый вывод контроллера подключён к базе транзистора.
в Di Halt Rtos написал четыре вот таких процедуры: Код
void QuoterStep_1(void) { SetByt(DRIVE_PORTD,DRIVE_PIN_0); ClearByt(DRIVE_PORTD,DRIVE_PIN_1); ClearByt(DRIVE_PORTB,DRIVE_PIN_2); // <-- порт B ClearByt(DRIVE_PORTD,DRIVE_PIN_3); SetTimerTask(QuoterStep_2, MECH_STEP_TIME); } void QuoterStep_2(void) { ClearByt(DRIVE_PORTD,DRIVE_PIN_0); SetByt(DRIVE_PORTD,DRIVE_PIN_1); ClearByt(DRIVE_PORTB,DRIVE_PIN_2); // <-- порт B ClearByt(DRIVE_PORTD,DRIVE_PIN_3); SetTimerTask(QuoterStep_3, MECH_STEP_TIME); } void QuoterStep_3(void) { ClearByt(DRIVE_PORTD,DRIVE_PIN_0); ClearByt(DRIVE_PORTD,DRIVE_PIN_1); SetByt(DRIVE_PORTB,DRIVE_PIN_2); // <-- порт B ClearByt(DRIVE_PORTD,DRIVE_PIN_3); SetTimerTask(QuoterStep_4, MECH_STEP_TIME); } void QuoterStep_4(void) { ClearByt(DRIVE_PORTD,DRIVE_PIN_0); ClearByt(DRIVE_PORTD,DRIVE_PIN_1); ClearByt(DRIVE_PORTB,DRIVE_PIN_2); // <-- порт B SetByt(DRIVE_PORTD,DRIVE_PIN_3); SetTask(MechSet1200); } сейчас у меня эти процедуры вызываются несколько другими процедурами. нужно сделать так чтобы в конце QuoterStep_4 в строке SetTask(MechSet1200); на месте MechSet1200 была та самая процедура что вызвала начальную процедуру QuoterStep_1 этой цепочки. через переменную и затем switch-case в конце считаю неспортивным. я попытался разобраться в механизме SetTask и TaskManager. первая функция сохраняет в массиве указатель (как значение пееменой) на пользовательскую функцию, а вторая уже достаёт из массива сей указатель и выполняет кусок кода. typedef void (*TPTR)(void); // я так думаю что это та самая переменная объявлена. точно также надо объявить свою(?) а как вызывать такую весчь? у Ди токль (GoToTask)(); // Переходим к задаче и всё. то есть для того чтобы реализовать задуманное мне надо объявить некую переменную(?какой тип?) затем до вызова QuoterStep_1 присвоить ей значение указателя процедуры/функции. а затем в QuoterStep_4 на месте строки SetTask(MechSet1200) сделать SetTask(nasha_perennaya) кто может подсказать как это сделать? или какие разделы по Си и Си++ читать?
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
24.03.2016, 11:47 | 8 |
разобрался.
в хидере объявил typedef void (*DPDR)(void); в коде сделал глобальную переменную с пустышкой по умолчанию DPDR GoToTaskAfter = Idle; и вызываем цепочку процедур (1->2, 2->3,3->4) через диспетчер задач с присвоением переменной GoToTaskAfter = OurProcedure ; получется (OurProcedure->1, 1->2, 2->3, 3->4 ,4->GoToTaskAfter )
0
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
|
24.03.2016, 12:22 | 9 |
2Orsomum. Мне кажется, у вас изначально путь решения задачи не верный. Отсюда выходит эта акробатика с указателями. Но чтоб сказать как это сделать лучше, нужно знать всю задачу.
0
|
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 619
|
|
25.03.2016, 22:35 | 10 |
Сообщение от itysiy
ВНИМАНИЕ! Возможны рвотные позывы при просмотре этого кода. суть - двигателем могут щёлкать разные задачи. чтобы не плодить строк кода и стали нужни все эти прыжки и ужимки. [69.39 Кб]
0
|
25.03.2016, 22:35 | |
25.03.2016, 22:35 | |
Помогаю со студенческими работами здесь
10
Вопрос к DI HALT. Использование PB II для отладки STM32F429! Halt (n), ФУНКЦИЯ HALT Embedded (2 Di Halt) Оператор HALT Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |