Главная » Статьи » Программирование в 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). | |
Просмотров: 2193 | |
Всего комментариев: 0 | |