Главная » Статьи » Программирование в CodeWarrior Development Studio 1.0.0

Создание нового проекта в CodeWarrior с ОС SmartDSP

Создание нового проекта


Нажимаем File -> New -> StarCore Project. Откроется окно как на рисунке 1.



В поле Project Name вводим имя проекта. Жмём next >



Выбираем процессор. В нашем случае MSC8156. Жмём Next>
Выбираем язык С. Жмём Next>
SmartDSP OS: Ставим Yes. Жмём Next>
Ставим галочку Simulator. Можно оставить галочку Hardware.
Жмём Next>, Next>, Next>, Finish.
Получили проект выглядящий так:



Выбираем Source -> basic_demo.c
Если сократить программу до минимума, то она будет выглядеть так:


#include "smartdsp_os.h"
#include "os_config.h"
#include "os_cache.h"

static void appBackground(void)
{
     while(1);
}

static os_status appInit()
{
     return OS_SUCCESS;
}

void main()
{
     os_status status;

     status = osInitialize();
     if (status != OS_SUCCESS) OS_ASSERT;
     status = appInit();
     if (status != OS_SUCCESS) OS_ASSERT;
     status = osStart(appBackground);
     if (status != OS_SUCCESS) OS_ASSERT;
}

Коротко опишу, что тут есть:

status = osInitialize();
Эта строка инициализирует ОС.

status = appInit();
В этой функции пользователь может инициализировать необходимые ему компоненты. Только стоит помнить, что всё, что касается ОС будет работать только после строки:
status = osStart(appBackground);
Запускающей ОС.

После запуска ОС, если не существует других задач (Task) мы попадаем в задачу (task) static void appBackground(void), где и будем бесконечно крутиться благодаря бесконечному циклу while(1); В проекте, созданном по умолчанию, ещё инициализированы программное прерывание и таймер.
Рассмотрим инициализацию таймера. Для создания таймера в глобальные переменные записываем:
os_timer_handle timer_handle;
здесь будет храниться указатель на таймер.
Теперь надо переписать функцию appInit() следующим образом:

static os_status appInit()
{
     os_status status;

     /* Create a software timer */
     status = osTimerFind(&timer_handle);
     OS_ASSERT_COND(status == OS_SUCCESS);

     status = osTimerCreate(timer_handle, OS_TIMER_ONE_SHOT, 1, appTimerHandler);
     OS_ASSERT_COND(status == OS_SUCCESS);

     return OS_SUCCESS;
}

Тут строкой:
status = osTimerFind(&timer_handle);
Мы находим свободный таймер и записываем указатель на него в timer_handle.
Строкой:
status = osTimerCreate(timer_handle, OS_TIMER_ONE_SHOT, 1, appTimerHandler);
Мы создаём сам таймер.
В качестве аргументов этой функции используются следующие:
1) timer_handle – указатель на таймер.
2) OS_TIMER_ONE_SHOT – тип работы таймера.
  OS_TIMER_ONE_SHOT – Таймер запускается 1 раз и считает до заданного значения.
  OS_TIMER_PERIODIC – Таймер работает до заданного значения, затем перезапускается.
  OS_TIMER_FREE_RUN – Таймер работает непрерывно.
3) 1 – кол-во тактов через которое сработает таймер.
4) appTimerHandler – название функции, которая будет вызвана при прерывании.

Рассмотрим теперь создание своей задачи (task)
В глобальных переменных прописываем следующее:
#define TEST_STACK_SIZE 0x400

#pragma align task0_stack 8

os_task_handle task_handle0;//Номер задачи

В appInit() пишем:
os_status status;
os_task_init_param_t os_task_init_param;
//Ищем свободный номер для задачи.
status = osTaskFind(&task_handle);
OS_ASSERT_COND(status == OS_SUCCESS);
os_task_init_param.task_function = MyFunction0;//Название вызываемой функции.
os_task_init_param.task_name = "MY_TASK0";//Название задачи
os_task_init_param.stack_size = TEST_STACK_SIZE;
os_task_init_param.task_arg = 0;
os_task_init_param.task_priority = OS_TASK_PRIORITY_27; //приоритет задачи
os_task_init_param.private_data = 0;
os_task_init_param.top_of_stack = (uint32_t)task0_stack;

status = osTaskCreate(task_handle0, &os_task_init_param); //Создание задачи.
OS_ASSERT_COND(status == OS_SUCCESS);
osTaskActivate(task_handle0);//Запуск задачи.

Теперь просто описываем, что будет делать функция MyFunction0:

void MyFunction0(uint32_t p)
{
    VAR_UNUSED(p);
}

В нашем случае она не делает ничего и сразу заканчивает свою работу. По окончании всех пользовательских задач, как было сказано выше, мы попадаем в задачу по умолчанию appBackground(void).
Категория: Программирование в CodeWarrior Development Studio 1.0.0 | Добавил: Korvin (18.07.2012)
Просмотров: 2193 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]