Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Много про ОСи гутарим. Вот заготовка для самой тупой оси(+)

Отправлено Quasy 02 апреля 2008 г. 12:29


Заготовка уверенно работает под дебаггером ИАР :)
Начинающим может быть полезно (хотя сомневаюсь :))
Просто карусель. С помощью манипулирования счетчиками шагов задач
можно накропать простые программы с межшаговыми переходами. Почему-то напомнило программируемый калькулятор.
Цель - хоть немного вернуть конфу к Главной теме.


#include <iom128.h>
#include <ina90.h>
#include <pgmspace.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
//////////////////
//////////////////
typedef void ( * PtrToFun ) (void);
typedef struct
{
unsigned char OS_index; // Шаг текущей задачи
unsigned long OS_timer; // Можно использовать для задержки
}OS_desc;
//////////////////
// Массив указателей на шаги задач
#define MAX_STEPS_OF_TASK2 (4)
PtrToFun OS_Area_Task2[ MAX_STEPS_OF_TASK2 ];
/////
#define MAX_STEPS_OF_TASK3 (5)
PtrToFun OS_Area_Task3[ MAX_STEPS_OF_TASK3 ];
//////////////////
OS_desc OS_desc_task2; // Дескриптор задачи 2
OS_desc OS_desc_task3; // Дескриптор задачи 3
//////////////////
// Для удобства обращения к полям структкры
#define OS_INDEX_TASK2 OS_desc_task2.OS_index
#define OS_TIMER_TASK2 OS_desc_task2.OS_timer
#define OS_INDEX_TASK3 OS_desc_task3.OS_index
#define OS_TIMER_TASK3 OS_desc_task3.OS_timer
//////////////////

// Вот теперь пошли задачи. Каждая разбита на элементарные действия.
// Средства общения -глобальные переменные ( не у Пронькиных,
// семафоров здесь немае :))
// Задача 1 - это пусть main (фоновая). Пусть задача 2 из 4-х
// шагов, задача 3 из 5 шагов с подобием таймера.

//////////////////
void OS_Task2_Step1( void )
{
//////////////////
// ЭЛЕМЕНТАРНОЕ ДЕЙСТВИЕ (ШАГ 1) ЗАДАЧИ 2
printf("0000\n");
//////////////////

//////////////////
// После выполнения элементарного
// действия надо разрешить переход
// на следующий шаг (шаг 2 задачи 2)
OS_INDEX_TASK2 = 2;
//////////////////
}
void OS_Task2_Step2( void )
{
//////////////////
// ЭЛЕМЕНТАРНОЕ ДЕЙСТВИЕ (ШАГ 2) ЗАДАЧИ 2
printf("1111\n");
//////////////////

//////////////////
// После выполнения элементарного
// действия надо разрешить переход
// на следующий шаг (шаг 3 задачи 2)
OS_INDEX_TASK2 = 3;
//////////////////
}
void OS_Task2_Step3( void )
{
//////////////////
// ЭЛЕМЕНТАРНОЕ ДЕЙСТВИЕ (ШАГ 3) ЗАДАЧИ 2
printf("2222\n");
//////////////////

//////////////////
// После выполнения последнего
// элементарного действия задачи 2
// надо перевести ее в Idle и разрешить
// работу задаче 3
OS_INDEX_TASK2 = 0; // Idle Task2
OS_INDEX_TASK3 = 1; // Задача 3 Go!
//////////////////
}
//////////////////

//////////////////
void OS_Task3_Step1( void )
{
//////////////////
// ЭЛЕМЕНТАРНОЕ ДЕЙСТВИЕ (ШАГ 1) ЗАДАЧИ 3
printf("3333\n");
//////////////////

//////////////////
// После выполнения элементарного
// действия надо разрешить переход
// на следующий шаг (шаг 2 задачи 3)
OS_INDEX_TASK3 = 2;
//////////////////
}
void OS_Task3_Step2( void )
{
//////////////////
// ЭЛЕМЕНТАРНОЕ ДЕЙСТВИЕ (ШАГ 2) ЗАДАЧИ 3
printf("4444\n");
//////////////////

//////////////////
// После выполнения элементарного
// действия надо разрешить переход
// на следующий шаг (шаг 3 задачи 3)
OS_INDEX_TASK3 = 3;
//////////////////
}
void OS_Task3_Step3( void )
{
//////////////////
// ЭЛЕМЕНТАРНОЕ ДЕЙСТВИЕ (ШАГ 2) ЗАДАЧИ 3
printf("Enable Timer\n");
//////////////////

//////////////////
// Использование таймера
OS_TIMER_TASK3 = 0;
//////////////////


//////////////////
// После выполнения элементарного
// действия надо разрешить переход
// на следующий шаг (шаг 4 задачи 3)
OS_INDEX_TASK3 = 4;
//////////////////
}
void OS_Task3_Step4( void )
{
//////////////////
// ЭЛЕМЕНТАРНОЕ ДЕЙСТВИЕ (ШАГ 3) ЗАДАЧИ 3
printf("Waiting...\n");
//////////////////

//////////////////
// Задержка (можно было бы и по аппаратному таймеру)
OS_TIMER_TASK3++;
if( OS_TIMER_TASK3 < 5 ) return; // На этот же шаг.
//////////////////

//////////////////
// После задержки
// надо перевести Task3 в Idle
// и разрешить работу задаче 2
OS_INDEX_TASK3 = 0; // Idle Task3
OS_INDEX_TASK2 = 1; // Задача 2 Go!
//////////////////
}
//////////////////

//////////////////
// Задача-пустышка
void OS_Task_Ilde( void )
{
;
}/*OS_Task_Ilde*/
// Перевод всех задач в Idle
void OS_Init_Tasks( void )
{
OS_INDEX_TASK2 = 0;
OS_INDEX_TASK3 = 0;

OS_Area_Task2[ 0 ] = OS_Task_Ilde;
OS_Area_Task2[ 1 ] = OS_Task2_Step1;
OS_Area_Task2[ 2 ] = OS_Task2_Step2;
OS_Area_Task2[ 3 ] = OS_Task2_Step3;

OS_Area_Task3[ 0 ] = OS_Task_Ilde;
OS_Area_Task3[ 1 ] = OS_Task3_Step1;
OS_Area_Task3[ 2 ] = OS_Task3_Step2;
OS_Area_Task3[ 3 ] = OS_Task3_Step3;
OS_Area_Task3[ 4 ] = OS_Task3_Step4;

}/*OS_Init_Tasks*/

//////////////////
__C_task main( void ) // Фоновая задача
{
OS_Init_Tasks();

OS_INDEX_TASK2 = 1; // start!

for(;;)
{
(*OS_Area_Task2[ OS_INDEX_TASK2 ])();
(*OS_Area_Task3[ OS_INDEX_TASK3 ])();
}/*for*/

}/*main*/
//////////////////


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 654:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru