999 вопросов по программированию

Тема в разделе "Флудилка", создана пользователем CYITEP_BAC9I, 9 авг 2018.

  1. parovoZZ

    parovoZZ Гуру

    видимо нас здесь только двое таких)))) Но у меня примеры RTOS под ESP и STM32 собираются. Абдурино не пробовал - травкой не увлекаюсь))))
     
    Igor68 нравится это.
  2. ostrov

    ostrov Гуру

    Спрашивается, как нам такое счастье занесло?
     
  3. Igor68

    Igor68 Гуру

    В Keil вообще RTX(RTOS) как примочка(библиотека) встроена... но для ARM/Cortex проще - там программа работает в режиме USER, а в прерывании в режиме SUPERUSER(SYSTEM)... именно в SysTimer прерывании он в этом режиме переключает "контекст" задачи... Хотя защищённый режим может и не важен... ведь всё в одной прошивке. Но если Вы делаете начальный загрузчик наверное это важно.
     
  4. parovoZZ

    parovoZZ Гуру

    Да я про RTOS вообще не знаю ничего. Но жутко интересно. Интересно его пощупать именно на ESP.
     
  5. Igor68

    Igor68 Гуру

    Да возьмите KEIL... ну хотя бы uVision3... даже там было. Не надо железок, а просто в режиме эмуляции. Не скажу что они сделали быстро... но можно и самому прикрутить. А выглядит так:
    - типа создаём функции в проекте
    - в main() инициализируем кернел.
    Сам много этим не пользовался... делал самодельный код переключения контекста функций USER.
    но выглядит так:
    Описал функции... и в каждой функции делал os_dly_wait(если память не изменяет)... и вроде какой-то код выполняется "параллельно". Там гораздо больше средств, чем я сказал. Главное правильно выбрать приоритеты и времени сна для функций. Своего рода многозадачность в одной прошивке... именно в прошивке.
     
    SergeiL нравится это.
  6. parovoZZ

    parovoZZ Гуру

    А есть разница во фреймворках RTOS в разных IDE?
     
  7. Igor68

    Igor68 Гуру

    Кстати про старый кейл... там ограничение по объему компиляции кода. Но примеры (даже с ARTX-RTOS), которые входят в пакет для ряда контроллеров спокойно работают. И пощупать в режиме симуляции даже с периферией. Но... но для STM симуляция более чем скудная. Уж больно у них "мутная" документация по сравнению с другими контроллерами. А например AT91SAM7S64 шикарная эмуляция (вкладки для периферии). И таймеры и АЦП и ЦАП и ШИМ и GPIO и прерывания и....
     
  8. Igor68

    Igor68 Гуру

    А вот про это не скажу... но RTOS вроде как стандарт для встраиваемых устройств на основе только прошивки. Распространяется в основном только на основе библиотек для создаваемого вновь проекта... ну и заголовочные файлы:
    вот смотрите(вырезка из Keil "blink rtx"):
    Код (C++):
    /*----------------------------------------------------------------------------
    *      A R T X   K e r n e l   E x a m p l e
    *----------------------------------------------------------------------------
    *      Name:    BLINKY.C
    *      Purpose: Advanced RTX example program
    *      Rev.:    V1.10 / 11-jul-2005
    *----------------------------------------------------------------------------
    *      This code is part of the ARTX-ARM kernel package of Keil Software.
    *      Copyright (c) 2004-2005 Keil Software. All rights reserved.
    *---------------------------------------------------------------------------*/


    #include <ARTX.h>
    #include <AT91SAM7S64.H>                    /* AT91SAMT7S64 definitions */
    #include "..\Board.h"


    OS_TID t_phaseA;                        /* assigned task id of task: phase_a */
    OS_TID t_phaseB;                        /* assigned task id of task: phase_b */
    OS_TID t_phaseC;                        /* assigned task id of task: phase_c */
    OS_TID t_phaseD;                        /* assigned task id of task: phase_d */

    #define LED_A   0x010000
    #define LED_B   0x020000
    #define LED_C   0x040000
    #define LED_D   0x080000


    /*----------------------------------------------------------------------------
    *        Function 'signal_func' called from multiple tasks
    *---------------------------------------------------------------------------*/

    void signal_func (OS_TID task)  {
      os_dly_wait (100);                     /* delay 100 clock ticks            */
      os_evt_set (0x0001, task);             /* send event to task 'task'        */
      os_dly_wait (100);                     /* delay 100 clock ticks            */
    }

    /*----------------------------------------------------------------------------
    *        Task 1 'phaseA': Phase A output
    *---------------------------------------------------------------------------*/

    void phaseA (void) __task {
      for (;;) {
        os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
        *AT91C_PIOA_CODR = LED1;
        signal_func (t_phaseB);              /* call common signal function      */
        *AT91C_PIOA_SODR = LED1;
      }
    }

    /*----------------------------------------------------------------------------
    *        Task 2 'phaseB': Phase B output
    *---------------------------------------------------------------------------*/

    void phaseB (void) __task {
      for (;;) {
        os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
        *AT91C_PIOA_CODR = LED2;
        signal_func (t_phaseC);              /* call common signal function      */
        *AT91C_PIOA_SODR = LED2;
      }
    }

    /*----------------------------------------------------------------------------
    *        Task 3 'phaseC': Phase C output
    *---------------------------------------------------------------------------*/

    void phaseC (void) __task {
      for (;;) {
        os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
        *AT91C_PIOA_CODR = LED3;
        signal_func (t_phaseD);              /* call common signal function      */
        *AT91C_PIOA_SODR = LED3;
      }
    }

    /*----------------------------------------------------------------------------
    *        Task 4 'phaseD': Phase D output
    *---------------------------------------------------------------------------*/

    void phaseD (void) __task {
      for (;;) {
        os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
        *AT91C_PIOA_CODR = LED4;
        signal_func (t_phaseA);              /* call common signal function      */
        *AT91C_PIOA_SODR = LED4;
      }
    }

    /*----------------------------------------------------------------------------
    *        Task 5 'init': Initialize
    *---------------------------------------------------------------------------*/

    void init (void) __task {

      *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA);   /* Enable Clock for PIO    */

      *AT91C_PIOA_PER  = LED_MASK;              /* Enable PIO for LED1..4  */
      *AT91C_PIOA_OER  = LED_MASK;              /* LED1..4 are Outputs     */
      *AT91C_PIOA_SODR = LED_MASK;              /* Turn off LED's ("1")    */

      t_phaseA = os_tsk_create (phaseA, 0);  /* start task phaseA                */
      t_phaseB = os_tsk_create (phaseB, 0);  /* start task phaseB                */
      t_phaseC = os_tsk_create (phaseC, 0);  /* start task phaseC                */
      t_phaseD = os_tsk_create (phaseD, 0);  /* start task phaseD                */
      os_evt_set (0x0001, t_phaseA);         /* send signal event to task phaseA */
      os_tsk_delete_self ();
    }

    /*----------------------------------------------------------------------------
    *        Main: Initialize and start ARTX Kernel
    *---------------------------------------------------------------------------*/

    void main (void) {
      os_sys_init (init);                    /* Initialize ARTX and start init   */
    }

    /*----------------------------------------------------------------------------
    * end of file
    *---------------------------------------------------------------------------*/

     
    Видите os_sys_init(init) - указали функцию init... а она формирует таски. А проект должен быть: RTX_Kernel
     
    SergeiL нравится это.
  9. SergeiL

    SergeiL Гуру

    Под RTOS писать проще, но написание под RTOS требует большего понимания и умения разделить задачу на мелкие компоненты, ждущие событий. Все крутится вокруг событий, и регулируется приоритетами.
     
    Igor68 нравится это.
  10. Igor68

    Igor68 Гуру

    Кстати вот RTX симулируется хреново. Нормально по JTAG. А вот простые проекты (без RTX) нормально и в симуляции. Вот блинк без RTX:
    Снимок46.jpg
    Я вывел только порт GPIO. Там в динамике видно изменение уровней выхода. Можно симулировать и входы - как настроите. Кстати помогает изменять настройки портов и тут же изменять код, перекомпилировать и перезапускать режим симуляции. Удобно при начальной настройки периферии.
     
  11. Igor68

    Igor68 Гуру

    Может... но в ряде случаев упрощает. Но можно сделать и самодельную систему. Поверьте это не сложно... главное при выходе из начальных инициализаций перейти в режим USER. А потом только сохранять контекст(набор регистров) сохранять его в структуре, выбирать другой контекст из структуры и записывать в регистры... а потом выходить в режим USER. Если не надо приоритеты и т.п.то можно и так. А "переключатель" будет работать по прерыванию SysTick... он(таймер системный) для того и есть.
     
    SergeiL нравится это.
  12. SergeiL

    SergeiL Гуру

    О!!! Как это мне знакомо!!!
    в 80-ых меня перевели в системный отдел, где писалась своя RT OC.
    Это были самые интересные годы моей работы, все писалось под MS-DOS, надстройкой над INT13, INT21, и системным таймером, для переключения задач!
    Все так!
     
    ostrov и Igor68 нравится это.
  13. SergeiL

    SergeiL Гуру

    Из приколов было три Териса (можно было и восемь, но не было желающих) на разных консолях, работающих параллельно, попробуй уложи все три, переключая консоли :) (пока управляешь фигурой в одном , в остальных все падает...)
     
    Igor68 нравится это.
  14. Igor68

    Igor68 Гуру

    Времена те помню... и кстати системные вызовы INTxx это просто вызовы в ARM они обзываются SWI и SWC(Cortex). но набор регистров... кстати не все надо было сохранять... регистр статуса, счётчик команд, обработать и сохранить указатель стека. А вот для INTxx есть правило согласно передачи параметров. Кстати благодаря INT(SWI,SWC) можно вызвать некую функцию системы и BIOS... а простой вызов типа CALL(у других ядер своё название) для нормальных процессоров обычно AddressAbort... контроллер памяти... ну и прерывание для режима USER
     
    SergeiL нравится это.
  15. SergeiL

    SergeiL Гуру

    До сих пор пользуюсь отладчиком AFD, или AT86 для создания мелких программ на асме под 32 разрядную Винду - реально DOS, теперь виртуалку под Hyper-V... (можно и на асме написать., и скомпилировать, но проще запустить отладчик, обнулить 1000 ячеек памяти примеру, с CS:100 написать то, что нужно на асме, записать нужные данные с DS:00, и сохранить в файл с сотого адреса в *. com файл. Ну так же проще!!!
    Читал, смотрел, понимаю, но по причине того, что почти как 20 лет программирование перешло в раздел хобби, нет времени на освоение. Общаюсь со старыми коллегами, они перешли на Cortex, в основном под RTOS, (как хобби тоже, как писали так и пишут профессионально под Windows,Office) рассказывают, что все намного проще, чем было в 80-ые, да и понимаю это , смотрю примеры, собираю их. Но блин написать конечный автомат, под мои задачи, пока получается проще без RT OS, не сбоит, не виснет. чего желать больше???
     
    Последнее редактирование: 11 авг 2018
    Igor68 нравится это.
  16. Igor68

    Igor68 Гуру

    Да... но насколько помню чистая MS-DOS была не многозадачная... а просто файловая ОС. И для многозадачности надо было какой-никакой кернел или что-то подобное... ну хотя бы WINDOWS 3.10 и т.п. Хотя Microsoft и не очень работали в этом. А вот OS/2 warp - я от неё просто балдел... даже PCad 4.5 + PSpice там запускал... там были свои драйвера (мышь, дисплей). Долго по неумению "разрешал" от имени OS/2 отдавал им управление. Кстати в OS/2 были шахматы (почти 3D)... так вот я заставлял их играть "компьютер-компьютер" на детском уровне... и потом его(где-то месяц спустя) трудно уже было обыграть. Кстати многозадачная система. А ОЗУ было хреновым... точнее материнка (не хотела нормально видеть более 4Мб)... через месяц после установки нормально видела 16Мб.
     
  17. Igor68

    Igor68 Гуру

    Нееее! Я после того как "пощупал" Linux более ничего не хочу... ну только по требованию и ещё VisualStudio, Keil ну и то что бывает под Windows. Но только C/C++. Pascal и др даже знать не желаю. Я не сказал, что знаю C/C++... но я так же не знаю Русского(как и все)... но однако разговариваю только на нём.
     
  18. Igor68

    Igor68 Гуру

    А как может тряхнуть стариной и для Cortex... ну хотя бы M3 замутить kernel? ПрОстенький!? Без приоритетов, но маленький!?
     
  19. ИгорьК

    ИгорьК Давно здесь

    А какая жидкая раньше вода была.... эх...
     
    Igor68 и SergeiL нравится это.
  20. SergeiL

    SergeiL Гуру

    Приоритеты - это сердцу радость. Где еще??? Отношусь к ним с большой любовью и нежностью :)
    Отладчики - Там все легко - пальцы сами кнопки нажимают, даже не задумываешься!
    А тут же разбираться нужно.! ;)
    Надо бы! Прекрасно понимаю, что, и для чего нужно.:)
    Все "медленно" идет к смене работы, то, что сейчас - очень нравится...:

    Тут вопрос... Куда дальше, какое направление???
     
    Последнее редактирование: 11 авг 2018