реклама на сайте
подробности

 
 
> RTOS для STR912fw44 RTOS, планировщик задач
Новичек
сообщение Apr 6 2013, 17:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 6-04-13
Пользователь №: 76 382



Всем доброго времени суток!
Мне нужно реализовать планировщик задач. Для начала самый простой: без приоритетов через квант времени переключать два какие-нибудь процесса.
p.s. извините что если это глупый вопрос)

Сообщение отредактировал Новичек - Apr 6 2013, 17:33
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Новичек
сообщение May 3 2013, 18:08
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 6-04-13
Пользователь №: 76 382



Разбирал пример RTX_Blinky.
Возникли следующие вопросы:
1)присваиваются значение
Код
#define LED_A   0x02
#define LED_B   0x01
#define LED_C   0x08
#define LED_CLK 0x04

Из каких соображений взяли именно эти значения?
2что это значит?
Код
#define LED_On(led)     GPIO6->DR[led<<2] = ~led
#define LED_Off(led)    GPIO6->DR[led<<2] =  led

Я нашёл что
Код
#define GPIO6     ((GPIO_TypeDef *)GPIO6_BASE)
что это?
потом это
Код
typedef struct
{
  vu8 DR[1021];     /* Data Register                    */
  vu32 DDR;         /* Data Direction Register          */
} GPIO_TypeDef;


Код
#define GPIO6_BASE         (AHBAPB0_BASE + APB_GPIO6_OFST)

#define AHBAPB0_BASE           (AHB_APB_BRDG0_U)
#define AHB_APB_BRDG0_U    (0x58000000) /* AHB/APB Bridge 0 UnBuffered Space */
#define APB_GPIO6_OFST     (0x0000C000)   /* Offset of GPIO6 */

И тут я перестал понимать что я получил...

Тоже самое получил с разбором этого:
Код
#define SCU                ((SCU_TypeDef *)SCU_BASE)

typedef struct
{
  vu32 CLKCNTR;    /* Clock Control Register                       */
  vu32 PLLCONF;    /* PLL Configuration Register                   */
  vu32 SYSSTATUS;  /* System Status Register                       */
  vu32 PWRMNG;     /* Power Management Register                    */
  vu32 ITCMSK;     /* Interrupt Mask Register                      */
  vu32 PCGRO;      /* Peripheral Clock Gating Register 0           */
  vu32 PCGR1;      /* Peripheral Clock Gating Register 1           */
  vu32 PRR0;       /* Peripheral Reset Register 0                  */
  vu32 PRR1;       /* Peripheral Reset Register 1                  */
  vu32 MGR0;       /* Idle Mode Mask Gating Register 0             */
  vu32 MGR1;       /* Idle Mode Mask Gating Register 1             */
  vu32 PECGR0;     /* Peripheral Emulation Clock Gating Register 0 */
  vu32 PECGR1;     /* Peripheral Emulation Clock Gating Register 1 */
  vu32 SCR0;       /* System Configuration Register 0              */
  vu32 SCR1;       /* System Configuration Register 1              */
  vu32 SCR2;       /* System Configuration Register 2              */
  u32 EMPTY1;
  vu32 GPIOOUT[8];   /* GPIO Output Registers                      */
  vu32 GPIOIN[8];    /* GPIO Input Registers                       */
  vu32 GPIOTYPE[10]; /* GPIO Type Registers                        */
  vu32 GPIOEMI;      /* GPIO EMI Selector Register                 */
  vu32 WKUPSEL;      /* Wake-Up Selection Register                 */
  u32 EMPTY2[2];
  vu32 GPIOANA;      /* GPIO Analag mode Register                  */
} SCU_TypeDef;

#define SCU_BASE           (AHBAPB1_BASE + APB_SCU_OFST)
#define AHBAPB1_BASE           (AHB_APB_BRDG1_U)
#define AHB_APB_BRDG1_U    (0x5C000000) /* AHB/APB Bridge 1 UnBuffered Space */
#define APB_SCU_OFST       (0x00002000) /* Offset of System Controller */

объясните какие выводы я должен сделать?

4) разбирал функции которые там применяются получил:


Код
#define os_tsk_create(tsk,prio)       os_tsk_create0(tsk,prio,NULL,NULL)
typedef U32 OS_TID;
extern OS_TID    os_tsk_create0 (void (*task)(void), U32 prio_stksz,
                                 void *stk, void *argv);
**********************************************************************
#define os_evt_set(evt_flags,task_id) _os_evt_set((U32)rt_evt_set,evt_flags,task_id)

extern void      _os_evt_set (U32 p, U16 event_flags, OS_TID task_id)  __SVC_0;
**********************************************************************
#define os_tsk_delete_self()          os_tsk_delete(0)

extern OS_RESULT os_tsk_delete (OS_TID task_id);
#define os_tsk_delete(task_id)        _os_tsk_delete((U32)rt_tsk_delete,task_id)

extern OS_RESULT _os_tsk_delete (U32 p, OS_TID task_id)                __SVC_0;

#define __SVC_0         __svc_indirect(0)
**********************************************************************
#define os_evt_wait_and(wflags,tmo)   _os_evt_wait((U32)rt_evt_wait,wflags,tmo,__TRUE)
extern OS_RESULT _os_evt_wait(U32 p, U16 wait_flags, U16 timeout,
                                     BOOL and_wait)                    __SVC_0;
**********************************************************************
#define os_dly_wait(delay_time)    _os_dly_wait((U32)rt_dly_wait,delay_time)
extern void      _os_dly_wait (U32 p, U16 delay_time)                  __SVC_0;

функции объявлены а что они делают вообще не понятно.. Мб я не то нашёл... так же вообще не нашёл что делает _os_dly_wait, __SVC_0 , __svc_indirect(0). Или как раз _os_dly_wait выполняет __SVC_0 тогда все равно не ясно что делает __SVC_0.
з.ы. извините за дурацкие вопросы))
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 3 2013, 19:31
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Новичек @ May 3 2013, 21:08) *
Разбирал пример RTX_Blinky.
Возникли следующие вопросы:
1)присваиваются значение
Код
#define LED_A   0x02
#define LED_B   0x01
#define LED_C   0x08
#define LED_CLK 0x04

Из каких соображений взяли именно эти значения?


Заметьте что в каждом определении есть только по одному единичному биту. Эти биты определяют пин в порте GPIO6 к которому подключен соответствующий светодиод.

Цитата(Новичек @ May 3 2013, 21:08) *
2что это значит?
Код
#define LED_On(led)     GPIO6->DR[led<<2] = ~led
#define LED_Off(led)    GPIO6->DR[led<<2] =  led

Я нашёл что
Код
#define GPIO6     ((GPIO_TypeDef *)GPIO6_BASE)
что это?
потом это
Код
typedef struct
{
  vu8 DR[1021];     /* Data Register                    */
  vu32 DDR;         /* Data Direction Register          */
} GPIO_TypeDef;


Здесь вам надо прочитать параграф 3.2.1 GPIO_DATA register read/write masking из юзермануала на STR912.
Так программисты Keil-а объявили порты чтобы реализовать запись единичных битов без предварительного чтения порта. А маской служит шина адреса. Т.е. индекc массива он появляется на шине адреса во время записи и определяет маску куда будет записан бит.
Такой вот оригинальный подход есть в STR912.

Если бы не этот финт, то надо было бы сначала прочитать в регистр CPU состояние порта, потом изменить один интересующий бит в регистре и обратно записать регистр в порт. Этот метод называют чтение-модификация-запись.

Но в многозадачной среде надо быть готовым, что в момент времени между чтением порта и записью в него может влезть другая более приоритетная задача, которая тоже хочет что-то записать в другой бит этого порта. Она свое дело сделает и отдаст управление первой задаче, а та тут же перезапишет в порт старые не актуальные данные.
Так рождаются самые самые мистические и трудно ловимые баги в RTOS.
По уму надо было бы тогда запрещать прерывания другими задачами участка где идет изменение бита в порту, но тогда запись каждого бита превращается в целую процедуру.

Цитата(Новичек @ May 3 2013, 21:08) *
Код
#define GPIO6_BASE         (AHBAPB0_BASE + APB_GPIO6_OFST)

#define AHBAPB0_BASE           (AHB_APB_BRDG0_U)
#define AHB_APB_BRDG0_U    (0x58000000) /* AHB/APB Bridge 0 UnBuffered Space */
#define APB_GPIO6_OFST     (0x0000C000)   /* Offset of GPIO6 */

И тут я перестал понимать что я получил...


Здесь как бы понятно. Адреса задаются как смещения от базы.
Причем базы может быть две с разными адресами. Здесь выбрана база AHB_APB_BRDG0_U. Если адресоваться от нее то запись не будет внутри чипа буферизироваться. Это медленнее, но зато не будет конфликтов с движком DMA.
Есть другая база, при адресации от нее запись буферизируется. Это быстрее, но надо следить чтобы туда не лазил DMA.


Цитата(Новичек @ May 3 2013, 21:08) *
4) разбирал функции которые там применяются получил:


Код
#define os_tsk_create(tsk,prio)       os_tsk_create0(tsk,prio,NULL,NULL)
typedef U32 OS_TID;
extern OS_TID    os_tsk_create0 (void (*task)(void), U32 prio_stksz,
                                 void *stk, void *argv);
**********************************************************************
#define os_evt_set(evt_flags,task_id) _os_evt_set((U32)rt_evt_set,evt_flags,task_id)

extern void      _os_evt_set (U32 p, U16 event_flags, OS_TID task_id)  __SVC_0;
**********************************************************************
#define os_tsk_delete_self()          os_tsk_delete(0)

extern OS_RESULT os_tsk_delete (OS_TID task_id);
#define os_tsk_delete(task_id)        _os_tsk_delete((U32)rt_tsk_delete,task_id)

extern OS_RESULT _os_tsk_delete (U32 p, OS_TID task_id)                __SVC_0;

#define __SVC_0         __svc_indirect(0)
**********************************************************************
#define os_evt_wait_and(wflags,tmo)   _os_evt_wait((U32)rt_evt_wait,wflags,tmo,__TRUE)
extern OS_RESULT _os_evt_wait(U32 p, U16 wait_flags, U16 timeout,
                                     BOOL and_wait)                    __SVC_0;
**********************************************************************
#define os_dly_wait(delay_time)    _os_dly_wait((U32)rt_dly_wait,delay_time)
extern void      _os_dly_wait (U32 p, U16 delay_time)                  __SVC_0;

функции объявлены а что они делают вообще не понятно.. Мб я не то нашёл... так же вообще не нашёл что делает _os_dly_wait, __SVC_0 , __svc_indirect(0). Или как раз _os_dly_wait выполняет __SVC_0 тогда все равно не ясно что делает __SVC_0.
з.ы. извините за дурацкие вопросы))


__SVC_0 - это служебное слово Keil-а и означает вызов прерывания супервизора по вектору SWI_Handler (определен в файле STR91x.s)
Далее обработчик в режиме супервизора достает из стека аргументы переданные при вызове прерывания.
Первым аргументом идет собственно указатель на функцию которую процедура прерывания должна выполнить.
Для _os_dly_wait это будет rt_dly_wait. Но выполняться она уже будет с правами супервизора.

Т.е. обычные задачи в RL ARM выполняются с правами юзера и это значит, что доступ к некоторым регистрам из задач будет закрыт.
Другие RTOS под ARM9 такое не применяют в виду громоздкости создания функций доступа к защищенной периферии.
А вот Keil не поленился.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Новичек   RTOS для STR912fw44 RTOS   Apr 6 2013, 17:31
- - SII   А в чём сложность-то? Заводите области сохранения ...   Apr 6 2013, 17:35
- - Ruslan1   Цитата(Новичек @ Apr 6 2013, 20:31) Всем ...   Apr 6 2013, 17:48
- - Новичек   У меня курсовая работа. Научник сказал написать пл...   Apr 6 2013, 18:26
|- - haker_fox   QUOTE (Новичек @ Apr 7 2013, 03:26) Я не ...   Apr 7 2013, 06:24
|- - AlexandrY   Цитата(Новичек @ Apr 6 2013, 21:26) У мен...   Apr 7 2013, 16:32
|- - Новичек   Цитата(AlexandrY @ Apr 7 2013, 20:32) Ква...   Apr 7 2013, 17:37
- - Новичек   Где найти этот таймер или есть какая та определенн...   Apr 7 2013, 15:45
- - Новичек   Где можно скачать uCOS-II? Никак не могу найти.   Apr 13 2013, 17:13
|- - _Артём_   Цитата(Новичек @ Apr 13 2013, 20:13) Где ...   Apr 13 2013, 17:46
- - Новичек   Помогите создать проект в Keil для str912 мигания ...   Apr 29 2013, 13:17
|- - AlexandrY   Цитата(Новичек @ Apr 29 2013, 16:17) Помо...   Apr 29 2013, 19:55
- - Новичек   Спасибо Александр. Как я понял там 3 проекта: Fla...   Apr 30 2013, 14:03
|- - AlexandrY   Цитата(Новичек @ Apr 30 2013, 17:03) Спас...   Apr 30 2013, 19:39
- - =AK=   Цитата(Новичек @ Apr 7 2013, 03:01) Мне н...   Apr 30 2013, 23:03
- - Новичек   А что на основной плате нет диодов? ОЧень много ф...   May 2 2013, 13:10
|- - AlexandrY   Цитата(Новичек @ May 2 2013, 16:10) А что...   May 2 2013, 13:58
- - Новичек   У меня курсовая работа. Научник сказал рабирайся с...   May 2 2013, 14:32
|- - AlexandrY   Цитата(Новичек @ May 2 2013, 17:32) ... ч...   May 2 2013, 19:30
- - Новичек   Спасибо за ваши ответы! по 1 вопросу. получае...   May 5 2013, 13:28
|- - AlexandrY   Цитата(Новичек @ May 5 2013, 16:28) Спаси...   May 5 2013, 20:09
- - Новичек   ЦитатаСмотрите схему платы На какую схему смотрет...   May 6 2013, 11:09
|- - AlexandrY   Цитата(Новичек @ May 6 2013, 14:09) На ка...   May 8 2013, 13:01
- - Новичек   Цитатаили попробовать запустить проект в симулятор...   May 9 2013, 13:26
|- - AlexandrY   Цитата(Новичек @ May 9 2013, 16:26) Как э...   May 9 2013, 13:58
- - Новичек   Шаг 1. Выбирает конфигурацию симулятора Шаг 2. Зап...   May 12 2013, 19:07
- - Новичек   У меня появилась плата MCB-STR9. Запустил на нее м...   May 16 2013, 14:46
- - Новичек   В проекте Measure есть описание как подключить кно...   May 18 2013, 19:23
|- - toweroff   Цитата(Новичек @ May 18 2013, 23:23) Что ...   May 19 2013, 08:04
- - Новичек   В мануале только написано что POR бит установления...   May 23 2013, 19:32
- - Новичек   В примере где задействов­ан потенциоме­тр blinky.p...   May 24 2013, 17:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 23:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016