Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; 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*/
//////////////////
Составить ответ | Вернуться на конференцию
Ответы
- Ответ: — Хлллдлд (02.04.2008 14:19:24 86.57.155.67, 632 байт)
- Ну и? — F8 (02.04.2008 13:34:3 213.130.22.7, пустое)
- Quasix? :) — AZ (02.04.2008 13:10:44 195.184.211.222, пустое)
- Quasyx — argus98 (02.04.2008 13:30:26 81.22.205.230, пустое)
- предлагаешь начать писать Qinux ? :))) — манипулятор (02.04.2008 12:43:4 208.73.49.114, 501 байт)