Перейти к содержанию
    

scmRTOS и MSP430F5xxx

Здравствуйте!

 

Не получается запустить scmRTOS на процессоре msp430f5529.

Застревает в DUMMY_INSTR().

 

Я так понимаю, нужно переписать ассемблерный код переключения контекста, т.к. архитектуры F1xxx и F5xxx процессоров отличаются?

 

Нет ли у кого порта под F5xxx?

Сам я вряд ли смогу его сделать.

 

 

OS_Kernel.cpp

void TKernel::sched()
{
    uint_fast8_t NextPrty = highest_priority(ReadyProcessMap);
    if(NextPrty != CurProcPriority)
    {
        SchedProcPriority = NextPrty;
    
        raise_context_switch();
        do
        {
            enable_context_switch();
            DUMMY_INSTR();
            disable_context_switch();
        } 
        while(CurProcPriority != SchedProcPriority); // until context switch done
    }
}

Изменено пользователем Slash

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Застревает в DUMMY_INSTR().
Не вызывается прерывание переключения контекста или оно не переключает контекст. Учитывая, что программа продоллжает работать - скорее первое.

Я так понимаю, нужно переписать ассемблерный код переключения контекста, т.к. архитектуры F1xxx и F5xxx процессоров отличаются?
В ассемблерном коде встречаются строчки "#elif __CORE__ == __430X_CORE__", т.е. он должен работать на ядре 430X. Там даже есть набор примеров для ядра 430X.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Я немного поторопился, нужно было поразбираться глубже.

 

Для переключения контекста я использовал Компаратор B.

Но, в отличие от Компратора А (на основе которого сделано переключение в примерах scmRTOS), запрос прерывания не сбрасывается автоматически при входе в обработчик прерывания.

Для сброса запроса прерывания нужно прочитать регистр CBIV, что заодно и сбросит флаг CBIFG в регистре CBINT.

 

Я добавил строчку

 mov.w &CBIV,&CBIV

в файл OS_Target_asm.s43 и программа заработала:

#if scmRTOS_CONTEXT_SWITCH_SCHEME == 1

  //  extern  OS_ContextSwitchStackData
    extern  os_context_switch_hook

    public context_switcher_isr

    common INTVEC(1)
    org   CONTEXT_SWITCH_ISR_VECTOR
    dc16  context_switcher_isr

    rseg ISR_CODE(1)

context_switcher_isr:
    save_regs
    mov.w   SP,r12
    xcall  #os_context_switch_hook
    mov.w   r12,SP
l_restore_context:
    restore_regs
    mov.w &CBIV,&CBIV // добавил
    reti

#endif // scmRTOS_CONTEXT_SWITCH_SCHEME

 

Можно ли добавить какую-то обертку (например в файл scmRTOS_TARGET_CFG.h) для добавления кода сброса запроса прерывания?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли добавить какую-то обертку (например в файл scmRTOS_TARGET_CFG.h) для добавления кода сброса запроса прерывания?

Да, так и делается. Из contex_switch_hook() вызывается INLINE void context_switch_user_hook() (только надо разрешить её вызов при конфигурации), в ней и сделать все необходимые дополнительные действия. Посмотрите пример для AVR, там как раз блокируется прерывание переключения контекстов внутри кода переключения. Этот пользовательский хук определён как раз в scmRTOS_TARGET_CFG.h. Этот файл и предназначен для тонкой настройки аппаратуры МК, которая используется для поддержки ОС. Для того чтобы не ограничивать пользователя в выборе этой аппаратуры, этот код вынесен на уровень пользовательского проекта. Если выбрали другой источник прерываний для переключения контекстов, то нужно и соответствующий код поддержки обеспечить для него. Вы на правильном пути. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли добавить какую-то обертку (например в файл scmRTOS_TARGET_CFG.h) для добавления кода сброса запроса прерывания?
Вы можете вставить эту команду в функцию OS::context_switch_user_hook(), предварительно разрешив ее использование в scmRTOS_CONFIG.h строкой

#define  scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE  1

Саму функцию можно сделать встраиваемой и поместить в scmRTOS_TARGET_CONFIG.h:

namespace OS
{
    INLINE void context_switch_user_hook()
    {
         CBIV = CBIV;
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и программа заработала:

 

А не могли бы все изменения кратенько описать? Там их, вроде, немного.

Вроде как все относящееся к компараторному регистру поменял, но пока ничего не получилось, компилятор то ли сам по себе глючит, то ли я его недопонимаю.

 

Как у Вас компилятор отнесся к

 

DEFCW( ADC10CTL0 , ADC10CTL0_)?

 

У меня компилятор на эту строку изругался (файл msp430f5510.h) при компиляции OS_Target_asm.s43.

 

Что ассемблеру тут не нравится (определение из msp430f5510.h)?

#define DEFCW(name, address) __no_init union \
{ \
  struct \
  { \
    volatile unsigned char  name##_L; \
    volatile unsigned char  name##_H; \
  }; \
  volatile unsigned short   name; \
} @ address;

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня компилятор на эту строку изругался
:bb-offtopic: Предлагаете нам догадаться, как именно он изругался - предлагаем вам догадаться, что именно ему не понравилось.

Что ассемблеру тут не нравится
Наверное ключевые слова совершенно другого языка программирования (Си) union, struct, volatile, unsigned, char, short, @?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я потому и хотел бы услышать ответ от товарища, которому удалось запустить scmRTOS на этом процессоре - я ничего от себя не добавлял, кроме модификаций связанных с компаратором, задача пустая абсолютно - ждать - переключить лапу. Зачем IARу понадобилось цеплять к этому ассемблерному файлу именно этот h файл - для меня загадка.

Для F2xx в h файлах таких извратов нет, посему все проходит.

Спасибо за наводку, буду рыть дальше. А наличие готового примера работающего с F5xx все-таки значительно облегчило бы участь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А наличие готового примера работающего с F5xx все-таки значительно облегчило бы участь.

Выкладываю проект, который у меня заработал.

rtos_5529.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкладываю проект, который у меня заработал.

Спасибо, у меня тоже по мотивам Ваших сообщений заработало. Но выглядит аляповато. Может, авторы со временем добавят сами в scmRTOS F5xx - все-таки и сами процессоры дешевле, и отлаживать их можно SBW - программатор тексас шлет за около 5 долларов с доставкой. И просто через USB можно загружать код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день. А мог бы кто-нибудь выложить рабочий пример для MSP430F5 под GCC?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...