Запуск scmRTOS на STM32vl-discovery.

В статье рассмотрено как собрать и запустить scmRTOS под discovery.

АРМы хороши тем, что ресурсов в микроконтроллере просто дохрена. А если учитывать тот факт, что ядро cortex-m3 предполагает работу под RTOS, то не использовать ее просто преступление.
Рассмотренная ОС имеет следующие преимущества:

  1. простая в освоении.
  2. написана на правильном языке С++.
  3. есть русскоязычная документация
  4. можно задать вопрос, на форуме, разработчикам. Если он не тупой, то на него даже ответят.

На этом ее преимущества закончились. Разработчики руководствовались принципом минимализма и удобством в использовании. Поэтому scmRTOS содержит только необходимый минимум и написана на С++. Если вы считаете, что ООП это неудобно то вы пенсионер. ООП на порядок ускоряет разработку и облегчает отладку проекта.

Если вы затеяли, что-то монументальное с гуем и эзернетом, то scmRTOS не для вас. Задолбаетесь это все прикручивать и адаптировать.

Теперь о недостатках:

  1. документация на английском есть, но на западе она не популярна. Там любят freeRTOS и uC. Для меня это большой минус.

Сначала топаем сюда и читаем. Без знания этой доки читать дальше особого смысла нет. Дальше читаем это. Это еще не дописано, но содержит полезную инфу относительно порта. А также нам понадобится сама операционака. Ее берем здесь .

Настройка среды программирования.


Пробовал использовать IAR, там поскудный редактор кода. К тому же он платный и его нельзя использовать в коммерческих проектах. Я работаю на американцев и для них крякнутая среда разработки это не пустой звук. В отличии от СНГ у них законы работают. После попробовал кокос и трушную студию. Кокс не доделан а халявная студия обрезана по самые помидоры. В итоге получается, что самый трушный это голый еклипс.

Как всегда, с опен сорцем, берем бубен. Я еще не видел ни одного опенсорсного проекта который бы работал без бубна.

Качаем Eclipse helios C/C++. Другие версии не подходят. Также нам понадобится Sourcery G++ Lite for ARM EABI, или другая сборка. Топаем сюда . После этого забываем рекомендации автора относительно копирования стандартных хеадеров. А также ни в коем случае не правим стандартный хеадер. Исключение это только если в нем содержится ошибка.

Дефайны в эклипсе добавляются здесь:


Если вы используете плагин, то именно здесь. Т.к. у разных компиляторов могут быть разные дефайны. Соответственно дефайн нужно добавить в каждом компиляторе(asm, C, C++).

Также формат выходного файла должен быть ihex( binary у меня st-utility брать не хочет).

Настраиваем отладчик .

Если вы впервые взялись за stm32, то на этом месте у вас появится вопрос. Что это за буквы на конце конфигов для линкера и как их определить. Линейку можно определить после открытия даташита на свой контроллер. А дальше можно сориентироваться по голосарию

Glossary

● Low-density value line devices are STM32F100xx microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.

● Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.

● Medium-density value line devices are STM32F100xx microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes.

● Medium-density devices are STM32F100xx, STM32F101xx, STM32F102xx and STM32F103xx microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes.

● High-density value line devices are STM32F100xx microcontrollers where the Flash memory density ranges between 256 and 512 Kbytes.

● High-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 256 and 512 Kbytes.

● Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.

Самое интересное.


На этом этапе среда разработки уже настроена и все необходимое уже имеется. Теперь необходимо собрать ОС. Распаковываем архив. Для тех кто не догадался, в репозитарии нужно клацнуть на «Download GNU tarball».

В эклипсе создаем С++ проект. В него копируем следующие папки:
  • \Common
  • \Extensions
  • \Ports\CortexM3\GCC в папку CortexM3
  • \Samples\CortexM3\GCC\1-EventFlag\prj в папку prj
  • \Samples\CortexM3\GCC\1-EventFlag\src из папки все файлы в корень.

Из проекта удаляем файлы core_cm3.h и stm32f10x.h. Эти файлы содержаться в STM32F10x_StdPeriph_Lib к которой у вас должны быть прописаны пути в ОС или в эклипсе.

У вас должно получиться следующие:


Пробежимся по интересным для нас файлам.

Pin.h содержит удобные макросы для работы с пинами. Эти макросы я использую и в проектах где нет scmRTOS.

Sysinit.cpp низкоуровневый конфиг. По умолчанию настроено на внешний кварц 8Мгц и максимальную частоту ядра, также все порты уже подключены. Для дисковери ничего менять не нужно.

Я его немного изменил и добавил коментов.

#include "stm32f10x.h"
 
static inline void init_clocks()
{
      // Enable HSE
      RCC->CR&=~(RCC_CR_HSEON | RCC_CR_HSEBYP);
      RCC->CR|=RCC_CR_HSEON;
 
      while (!(RCC->CR & RCC_CR_HSERDY)) ;
 
#if (!defined STM32F10X_LD_VL) && (!defined STM32F10X_MD_VL)
      // Enable Prefetch Buffer
      FLASH->ACR |= FLASH_ACR_PRFTBE;
 
      // Flash 2 wait state (if freq in 24..48 MHz range - 1WS.)
      FLASH->ACR &= ~FLASH_ACR_LATENCY;
    FLASH->ACR |= FLASH_ACR_LATENCY_2;
#endif
 
    // HCLK = SYSCLK, PCLK2 = HCLK, PCLK1 = HCLK/2
    RCC->CFGR &= ~(RCC_CFGR_HPRE | RCC_CFGR_PPRE2 | RCC_CFGR_PPRE1 | RCC_CFGR_ADCPRE);
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_ADCPRE_DIV6;
 
#ifdef STM32F10X_CL
      // PLL2/3 pre-divisor: PREDIV2 = 5 (25/5 = 5 MHz)
    RCC->CFGR2 &= ~RCC_CFGR2_PREDIV2;
      RCC->CFGR2 |= RCC_CFGR2_PREDIV2_DIV5;
      // PLL2 multiplier: PLL2CLK = 5 * 8 = 40 MHz
      RCC->CFGR2 &= ~RCC_CFGR2_PLL2MUL;
      RCC->CFGR2 |= RCC_CFGR2_PLL2MUL8;
 
      // Enable PLL2
      RCC->CR |= RCC_CR_PLL2ON;
      while(!(RCC->CR & RCC_CR_PLL2RDY)) ;
 
    // PREDIV1 configuration: SRC = PLL2, DIV = 5 (8MHz)
      RCC->CFGR2  &= ~(RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
      RCC->CFGR2 |= RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5;
 
      // PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz
      RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL | RCC_CFGR_OTGFSPRE);
      RCC->CFGR |= RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9;
 
#elif (defined STM32F10X_LD_VL) || (defined STM32F10X_MD_VL)
    /*  PLL configuration:  = (HSE / 2) * 6 = 24 MHz */
    RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6);
#else
      // PLLCLK = 8MHz * 9 = 72 MHz
      RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL);
      RCC->CFGR |= (RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9);
#endif
 
      // Enable PLL
      RCC->CR |= RCC_CR_PLLON;
 
      // Wait till PLL is ready
      while(!(RCC->CR & RCC_CR_PLLRDY)) ;
 
      // Select PLL as system clock source
      RCC->CFGR &= ~RCC_CFGR_SW;
      RCC->CFGR |= RCC_CFGR_SW_PLL;
 
    // Wait till PLL is used as system clock source
      while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) ;
}
 
extern "C" void init_HW(void);
 
 
void init_HW(void)
{
      // RCC system reset(for debug purpose)
      // Set HSION bit
      RCC->CR |= RCC_CR_HSION;
      // Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits
#ifndef STM32F10X_CL
      RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
      RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif
      // Reset HSEON, CSSON and PLLON bits
      RCC->CR &= ~(RCC_CR_HSEON | RCC_CR_CSSON | RCC_CR_PLLON);
      // Reset HSEBYP bit
      RCC->CR &= ~RCC_CR_HSEBYP;
      // Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits
      RCC->CFGR &= 0xFF80FFFF;
 
#ifdef STM32F10X_CL
      // Reset PLL2ON and PLL3ON bits
      RCC->CR &= 0xEBFFFFFF;
 
      // Disable all interrupts and clear pending bits
      RCC->CIR = 0x00FF0000;
 
      // Reset CFGR2 register
      RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
      // Disable all interrupts and clear pending bits
      RCC->CIR = 0x009F0000;
 
      // Reset CFGR2 register
      RCC->CFGR2 = 0x00000000;     
#else
      // Disable all interrupts and clear pending bits
      RCC->CIR = 0x009F0000;
#endif
 
      init_clocks();
 
      // enable IOPx periph
      RCC->APB2ENR |=
                  RCC_APB2ENR_IOPAEN |
                  RCC_APB2ENR_IOPBEN |
                  RCC_APB2ENR_IOPCEN |
                  RCC_APB2ENR_IOPDEN |
#ifdef RCC_APB2ENR_IOPEEN
                  RCC_APB2ENR_IOPEEN |
#endif
                  RCC_APB2ENR_AFIOEN;
 
 
// Настраиваем приоритеты прерываний.
// 15- самый низкий приоритет.
// 0 - самый высокий приоритет.
//
// PRIGROUP
// 0x7 - оброботчик прерывания может быть прерван любым более приоритетным прерыванием.
// 0x6 - оброботчик прерывания может быть прерван другим прерыванием, более приоритетным из
//          другой группы. (0-7 первая группа, 8-16 вторая группа)
// 0x3 - каждый обработчик прерывания может быть прерван другим, более приоритетным, прерыванием.
//
//    PRIGROUP      группы (с вытеснением)      подгруппы
//       0x3                 16                  0
//       0x4                  8                  2
//       0x5                  4                  4
//       0x6                  2                  8
//       0x7                  0                 16
 
//    NVIC_SetPriorityGrouping(7); // no preemption, 4 bit of subprio
      NVIC_SetPriorityGrouping(6); // 1 bit preemption, 3 bit of subprio
//    NVIC_SetPriorityGrouping(5); // 2 bit preemption, 2 bit of subprio
//    NVIC_SetPriorityGrouping(4); // 3 bit preemption, 1 bit of subprio
//    NVIC_SetPriorityGrouping(3); // 4 bit preemption, 0 bit of subprio
}


scmRTOS_TARGET_CFG.h содержит конфиги ОС для конкретного порта. В нем нас интересуют только строки:
// Define SysTick clock frequency and its interrupt rate in Hz.
#if   defined(STM32F10X_MD_VL) || defined(STM32F10X_HD_VL)
#     define SYSTICKFREQ     24000000
#else
#     define SYSTICKFREQ     72000000
#endif
#define SYSTICKINTRATE  1000


SYSTICKFREQ это частота ядра. И SYSTICKINTRATE это частота срабатывания системного таймера. Этот параметр определяет продолжительность кванта (1сек* SYSTICKINTRATE)/ SYSTICKFREQ. Если квант больше(значение SYSTICKINTRATE меньше), то время реакции ниже но кпд выше. И наоборот. Золотая середина подбирается для каждого проекта индивидуально.

scmRTOS_CONFIG.h содержит конфиг ОС.

В нем нужно установить scmRTOS_PROCESS_COUNT=2. Также я подключал хуки за ненадобностью. Ну и прочую хрень нужную для отладки. Остальные конфиги описаны в документации.
Собственно вот мой исходник для демонстрации:
#include "stm32f10x.h"
#include "pin.h"
#include "scmRTOS/Common/scmRTOS.h"
 
//---------------------------------------------------------------------------
//
//      Process types
//
typedef OS::process<OS::pr0, 300> TProc1;
typedef OS::process<OS::pr1, 300> TProc2;
//---------------------------------------------------------------------------
//
//      Process objects
//
TProc1 Proc1;
TProc2 Proc2;
//---------------------------------------------------------------------------
//
//      IO Pins
//
Pin<'C', 8> PC8;
Pin<'C', 9> PC9;
int main()
{
    // configure IO pins
    PC8.Direct(OUTPUT);
    PC8.Off();
    PC9.Direct(OUTPUT);
    PC9.Off();
 
    // run
    OS::run();
}
 
namespace OS
{
    template <>
    OS_PROCESS void TProc1::exec()
    {
        for(;;)
        {
            sleep(500);
            PC8.On();
            sleep(500);
            PC8.Off();
        }
    }
 
    template <>
    OS_PROCESS void TProc2::exec()
    {
        for(;;)
        {
            sleep(400);
            PC9.On();
            sleep(400);
            PC9.Off();
        }
    }
}



Классическая мигалка светодиодами.

Перед компиляцией добавляем в STM32F10X_MD_VL.ld в самый верх строки:
/* Entry Point */
ENTRY(Reset_Handler)


Без них отладка работать не будет. На поиск этого ляпа я потратил пару дней.

Теперь заходим в конфиг проекта и включаем оптимизацию –Os, для Debug мод, в С и С++ компиляторе. Зачем это нужно? Без этого оно не скомпилится а во вторых это не мешает отладке а наоборот улучшает ее. Без оптимизации проект отлаживать смысла нет. Т.к. не изветно сколько в реале беде потребляться памяти и оперативки. Тайминги будут совсем другие. И не забываем про случай с volatile. Его лучше выявить сразу, чем потом искать по всему проекту.
Вот теперь компилить можно. Компелируем и получаем туеву кучу ошибок. Нужно поправить пути, на подобие #include «scmRTOS/Common/scmRTOS.h».
Этого можно избежать если прописать пути к исходникам. Но у меня, в проектах используются разные версии scmRTOS и я это делать задолбался.
Поэтому я поступаю проще. Я делаю один шаблон под нужный порт а после использую его как основу.
Как поправите проект, у вас получится следующее:
Invoking: ARM Sourcery Windows GNU Print Size
arm-none-eabi-size  --format=berkeley scmRTOS_stm32v3.elf
   text        data         bss         dec         hex     filename
   1832           4        1340        3176         c68     scmRTOS_stm32v3.elf
Finished building: scmRTOS_stm32v3.siz


Конец .)
  • +4
  • 14 сентября 2011, 04:11
  • a9d

Комментарии (101)

RSS свернуть / развернуть
Перенес в коллективный блог.
0
Опять перенес в тематический блог. Если будете редактировать пост, то просьба предварительно вступить в блог ОС и rtos иначе пост опять улетит в ваш личный бложек. А ему уместней быть в коллективном.
0
А как туда вступить?? и где это делается?
0
  • avatar
  • a9d
  • 14 сентября 2011, 17:18
Все нашел миниатюрную кнопочку.
0
  • avatar
  • a9d
  • 14 сентября 2011, 17:20
Под названием блога, если туда зайти, есть такая маленькая вилочка. Вот ее надо нажать. Ну и еще в шапке сайта есть ссылка «справочная» там сей процесс показан в картинках.
0
Если вы считаете, что ООП это неудобно то вы пенсионер.

Ну вы прям как серпом по сталинским яйцам…
0
руководствовались принципом минимализма
С++
facepalm.jpg
0
Если вы считаете, что ООП это неудобно то вы пенсионер.
Лол. А Линус тоже пенсионер?
ООП на порядок ускоряет разработку и облегчает отладку проекта.
Ага, формальные фразочки. Зомби детектед)
0
Вообще-то фразу следовало бы переиначить так: «Умело применённое ООП ускоряет разработку и облегчат отладку проекта».
И это так. Всему своё место: и ASMу, и С, и С++, и ООП. А пихать что-то одно везде — маразм.
0
«Разработчики руководствовались принципом минимализма и удобством в использовании. Поэтому scmRTOS содержит только необходимый минимум и написана на С++. Если вы считаете, что ООП это неудобно то вы пенсионер.»
«Это еще не дописано, но содержит полезную инфу относительно порта.»
«Качаем Eclipse helios C/C++. Другие версии не подходят.»
«Без них отладка работать не будет.»

Лучше уж с uCLinux ковыряться…
+1
  • avatar
  • sqzd0
  • 14 сентября 2011, 11:54
А в каком году началась разработка линукса?)) Топаем учить историю.
Читай внимательно. Минимализм в функционале. Только самое необходимое содержится в операционке.

ООП на порядок ускоряет разработку и облегчает отладку проекта.
Ага, формальные фразочки. Зомби детектед)
Тут все уже понятно.

«Это еще не дописано, но содержит полезную инфу относительно порта.»
«Качаем Eclipse helios C/C++. Другие версии не подходят.»
«Без них отладка работать не будет.»

Лучше уж с uCLinux ковыряться…
Другой эклипс не подходит. Т.к. к нему нельзя подключить gdb сервер. Информация для порта кортекс нужна только для глубокого понимания.
Ошибка не в конфиге минимальна. С ней ОС работает. Но отладчик улетает в прерывание.
uCLinux лол. Как затолкаешь в кортек-м3 расскажешь.
0
  • avatar
  • a9d
  • 14 сентября 2011, 14:12
А в каком году началась разработка линукса?
А причём тут это? Ты читал тред по ссылке?

зы. ООП — это очень удобно. Для написания быдлокода и говноляпства.
0
Учи английский. Линус протестует не против ООП а против языка C++. У этого языка есть ряд спорных моментов и он чрезмерно усложнен. Но это не касается микроконтроллеров. Embedded C++ сильно кастрирован.
Я бы использовал другой ООП язык. Но конкурентов нет. На Си писать изврат. Посмотри на срач в именах freeRTOS.
0
  • avatar
  • a9d
  • 14 сентября 2011, 14:43
Линус протестует не против ООП а против языка C++
Я протестую против ООП. Особенно против С++.
Естественно, во многих других вещах (e.g. Java) ОО-код выглядит куда приятнее, чем в сраном С++. Но всё равно перегружен мусором до жути. По сравнению с чистеньким кодом на Си — небо и земля.
0
До этого я не дочитал. Да и про Java я не вижу участка. Но ООП называть Г* это на гране маразма. Не удивительно, что линукса на десктопах не будет.
0
  • avatar
  • a9d
  • 14 сентября 2011, 15:01
Ядро линуха — весьма неплохая вещь. Уже сейчас поддерживается большое количество железок, причём поддерживается значительно лучше чем виндой с драйверами от вендора. Вот с юзер интерфейсом и программками куда хуже. Но в тоже время, значительно лучше, чем в ранних виндах (до NT). Допилят. Учитывая как резко начала деградировать винда в плане юзер интерфейса (имеется в виду 6 ветка NT, а грядущий Вин8 — вообще явный закос под яблоко), и то, насколько лучше стал линух, резкий переход на десктопах гарантирован железно.
А гавно — это qt и KDE.
0
This is HOOOOOLYYYYWAAAR!!!111

Про поддержку железа — ATI Radeon, Broadcomm, LSI. Поддержка альтернативных ОС у них второстепенная задача. Или мне просто везёт на «несовместимое» оборудование.

Щяс кто-нить запостит фото сисег, и холивар сам отсупит ^_^
0
У ATI проблемы и с поддерживаемыми ОС.
0
>С++, facepalm.jpg
>ООП — это очень удобно. Для написания быдлокода и говноляпства.
>Ага, формальные фразочки. Зомби детектед)

так вот дабы не уподоблятся зомби, поглядели бы исходный код, там его всего-то около 50кб.
плюсы там используются без фанатизма и исключительно по делу:
например, шаблоны для каналов связи между процессами, сообщений, колцевого буфера и т.д.,
что никоим образом не раздувает генерируемый код, так как разворачивается всё во время компиляции.
зато избавляет например от описания всевозможных вариантов:
void push(char a); void push(int a); void push(double a); void push(TSlon a);…
0
  • avatar
  • _pv
  • 14 сентября 2011, 14:51
void push(char a); void push(int a); void push(double a); void push(TSlon a);
Вот это и есть говноляпство.
0
Ты определись уже. Шаблоны плюсов это тру. Реально эффективный инструмент, позволяющий как раз избавиться от зоопарка и все красиво под одну гребенку уложить.
0
+1, и наследование тоже очень полезная штука.
А что касательно шаблонов — в рабочем проекте на шарпе без них я бы повесился. Даже без мыла, на шнурках.
0
Грязнейший хак. Гораздо хуже копипасты. Я бы даже сказал, самый лучший способ превратить код в непроходимое болото.

Собсна вот,
Я изобрел понятие «объектно-ориентированный», но могу заявить, что не имел в виду C++ при этом.
— Alan Kay
0
Вообще такими словами бросаться — имхо непрофессионально как минимум.
И зачастую это не что иное, как попытка прикрыть собственный непрофессионализм (можно знать кучу всего, но в профессионала так и не вырасти. Лично я себя профи не считаю, зато есть куда стремиться, а не потчевать собственное эго).
Налицо явно непонимание, для чего же это самое ООП нужно. И как оно работает. Ведь все эти вещи в С++ ввели совсем не зря.
Были свои причины. Вот, к примеру, в чистом голом С легко обрабатывать исключения, «разматывать» стек исключений? ;)
А С++ позволяет делать более-менее нормально. Точно так же очень полезные вещи использовать вместо (MyType*), к примеру, static_cast<> и прочие. Только надо не лениться, а сесть и разобраться. Ты ж не забиваешь Ж/Д «костыли» молоточком невропатолога? Вот и тут так же.
И это ты ещё не видел свежепринятого стандарта С++0х (так, вроде). Там ещё сильнее «навернули» синтаксис. Вот только до МК этот стандарт может так и не добраться.
0
Что-то не туда закинуло коммент. Его следует относить ув. Lifelover, высказыванию
зы. ООП — это очень удобно. Для написания быдлокода и говноляпства.
0
С++ — это в первую очередь не ООП, а набор костылей. В новом стандарте С++0x просто добавили ещё пачку костылей. Естественно, я читал обзор этого стандарта.
0
Тогда пожалуйста обоснование. Да, развитие и новшества можно считать костылями. А можно и не считать.
Если знаешь, как сделать лучше — предложи.
Ну и если можно, то доказательство того, как шаблоны и наследование превращают код в «кашу». Пожалуйста доказательства. Просто так я тоже много чего «ляпнуть» могу.
Лично мне в текущем проекте (STM32) именно наследование помогает абстрагироваться от апппаратной части МК (код в будущем будет переноситься как минимум на MSP430). Предложи вариант лучше на голых плюсах. Чтобы код легко переносился с МК на МК, был типобезопасным и легкочитаемым. И можно было нормально использовать в проектах сразу для двух платформ. Без #define'ов, которые как раз и могут превратить код в кашу. В моём случае всё просто, наследуемся (при этом пишется минимум кода) и в инициализацию аппаратнонезависимой части подставляется наследник. Всё.
0
Код на Си, даже довольно грязный — очень легко читается. Твой проект с наследованиями и шаблонами через пару месяцев наверняка ты и сам не сможешь понять.
развитие и новшества можно считать костылями
ООП можно считать новшеством. Хоть оно и вносит жуткий оверхед, и делает код гораздо менее понятным и читабельным, заметает реализацию под ковёр, отвергает минимализм, всё таки это путь, и чем-то даже красивый. Си++ же — это просто набор костылей. Точка.
0
Си++ же — это просто набор костылей. Точка.
Доказательства. Доказательства. Иначе точно так же можно утверждать, что Земля — плоская.
Для начала предложи, как правильно, вместо
static_cast<>(), dynamic_cast<>(), reinterpret_cast<>().
Ну и докажи, что ООП делает код менее понятным, читабельным и сопровождаемым. И что его сложнее расширять.

А голые утверждения без доказательств — просто смешно. И как раз признак непрофессионализма.
0
Предложи вариант лучше на голых плюсах.
Правильно читать как: «Предложи вариант лучше на голом Си.»
0
Мне попадался код в котором для удаления элеметов списка создавался ещё один контейнер, данные копировались в него (с помощью оператора = определение которго еще поискать в дебрях наследования), и он удалялся, затем исходный список освобождал собственные структуры. На C так наверно еще никто делал :)

Легко читаемый и отлаживаемый это точно не про c++, уже лишь из-за собственной увеличенной сложности. Есть некоторые исключения, как например код работы с веторами/матрицами может быть очень выразителен на с++ из-за переопределения операторов. Шаблоны тоже могут быть полезны если не пытаться считать с их помощью число пи, хотя я думаю их присутвие в языке слишком поощряет преждевременную оптимизацию и раздутие кода.
0
Вы, товарищ, как всегда резки и категоричны. Буря эмоций на пустом месте. Что это? Детская психологическая травма? Хотите поговорить об этом?
+1
Хотите поговорить об этом?
Жжошь :D:D:D
0
uCLinux лол. Как затолкаешь в кортек-м3 расскажешь.
Читаем вот эту простыню. А я тебе потом, если хорошо вести себя будешь, расскажу, как это все подружить со стеком TCP/IP.
0
Да, это интересно. Лучше напиши об этом статью. Но также ты забыл сказать о небольших нюансах. В виде внешней памяти.
0
  • avatar
  • a9d
  • 15 сентября 2011, 16:03
Немного почитал. Есть еще 100500 но. Связанных с оперативкой и временем реакции.
uCLinux на stm32f100 идеальный выбор :)
0
  • avatar
  • a9d
  • 15 сентября 2011, 16:57
Не я написал про «идеальный выбор»
0
А кто тут вообще упоминал про него? scmRTOS простая и легкая, но для больших проектов не подходит. uCLinux подходит для больших проектов, но нужен микроконтроллер по мощнее.
0
  • avatar
  • a9d
  • 15 сентября 2011, 17:35
Есть мнение, что баян козе не нужен. Но в моем случае проще пилить uCLinux, чем пытаться обеспечить поддержку железу с закрытой спецификацией в scm или FreeRTOS.
0
Где ты там закрытость увидел???? Все доступно.
0
  • avatar
  • a9d
  • 15 сентября 2011, 18:59
Закрытость в железе с которым будет работать мой проект на stm32. Второй раз в молоко — удивительное у тебя умение читать между строк.
0
Уже осень. На улице ветрено. По меньше голову нагибай, а то корона спадет.
0
  • avatar
  • a9d
  • 16 сентября 2011, 14:48
А почему была выбрана именно эта RTOS? Из-за компактности?
0
Из-за простоты. Я ее начал использовать на AVR. Она отлично помещается на atmega8. Тогда я освоил ее за один вечер. С freeRTOS куда сложнее.
0
  • avatar
  • a9d
  • 14 сентября 2011, 18:29
подскажите где можно взять файл «pin.h»?
0
сорри за беспокойство уже нашел.
0
знатный бред про cpp…
0
  • avatar
  • bzzz
  • 04 января 2012, 18:35
напиши тогда лучше) Открой всем истину.
0
все давно открыто. большие проекты отлично пишутся на обычном си. с «виртуальными» методами и проч. и все это легко понимать и поддерживать…
0
Новые ОС пишут на С++. Драйвера под виндой уже давно пишут на С++.

Там где нужна скорость и расчеты Си не используют. А юзают другие языки которые намного лучше заточены под распараллеливание.
0
да-да, виндовс — это самая новая ос :) и самая лучшая, безусловно!
0
пациент найден)
Тебе нужно историю под учить.
Кода вышел асм все трушные программисты начали тролить этот язык) Такая же байда была и с СИ.
0
а тебе немного вокруг оглядеться… полно вещей, которые начинают писать на си и будут продолжать это делать. полно проектов, которым сложносnи, привносимые с cpp, нафиг не нужны. пример — ядро линукса. я работаю в проекте с 5M строк на си. и *все* считают, что цпп не просто не нужен — он ухудшит код, возможности его поддержки и развития.
0
Нравится пиши. Никто не запрещает.
Но когда придут процессоры где будут сотни ядер, то Си(как и С++) вымрет как динозавр.

Кстати эти процессоры уже пришли, но под них нет ОС.
0
когда придут, тогда и поговорим. не попади в просак, когда в следующий раз будешь разглагольствовать о «правильных» языках/ядрах/ос/проч.
0
А это не просак. Это называется будущее.
Функциональные языки сдали свои позиции в пользу ООП.
0
в будущем и поговорим. пока это в лучшем случае спекуляции. когда-то на ООП молились, а теперь многие плюются.
0
Это эволюция. Сейчас развивается блочное проектирование. Оно вытеснит ООП.
0
Винда, вобщем, тут ни при чем. Если внимательно посмотреть на типичный драйвер железяки или, скажем, файловой системы, то легко заметить, что, по сути, он представляет собой реализацию вполне конкретного и четко описанного интерфейса, то есть, по сути, является объектом. Как не сложно догадаться, объекты писать и поддерживать удобнее с использованием языка, который поддерживает соответствующую парадигму.
0
врешь. посмотри на драйвера устройств/фс в линуксе/bsd. без всякого cpp прекрасно реализуется.

ps. как же людям мозги-то пропесочили… жуть.
0
врешь.

Это не я вру, а вы не умеете читать.

посмотри на драйвера устройств/фс в линуксе/bsd. без всякого cpp прекрасно реализуется.

Вот именно туда вам и стоит посмотреть, причем внимательно. Это именно что объекты. А то, что взять более удобный инструмент кое-кому не позволяет религия и они продолжают закатывать солнце вручную, так это их проблема.

ps. как же людям мозги-то пропесочили… жуть.
Глядя на вас в это, безусловно, верится.
0
я вообще-то писал не один драйвер для линукса… и сейчас этим занимаюсь. и на цпп тоже когда-то писал. так вот код на си на порядок проще понимать и поддерживать. и с этим согласны еще очень многие (в том числе известные) люди. но местным хакерам конечно виднее какой язык является более правильным.
0
Ты почитай историю появления асма. Толпа известных людей со степенями гнобили асм. И что?
А также есть Ньютон. Его авторитет был общепризнанным. Все очкавали исправить его формулы. Но в итоге его формулы пофиксили.

Так что не прикрывайся толпами известных.
0
вообще-то цпп в обед сто лет… его ощупали и опробовали уже все кто мог, хотел и совсем не хотел.

ps. ньютоном прикрываться тебе ничего не мешает? :))
0
конечно. думай в следующий раз, прежде чем писать куйню типа «ООП на порядок ускоряет разработку и облегчает отладку проекта». сразу чувствуется, что человек никогда не участвовал в более-менее больших и длительных проектах.
0
О какие заявления))
0
думай в следующий раз, прежде чем писать куйню
Вам стоило бы придерживаться собственной рекомендации, прежде чем давать ее другим.
сразу чувствуется, что человек никогда не участвовал в более-менее больших и длительных проектах.
Да, именно это и чувствуется в том, что вы пишете.
0
Вообще-то С++ как стандарту лет не так уж много, а реализациям стандарта — и того меньше. Я уж не говорю о том, что стандартизаторы с какого-то перепугу стали двигать его в прикладное программирование, хотя изначально он был, как и С, языком системного программирования.
0
На С, как и на С++ можно писать очень по разному, поэтому обобщения типа «код на С на порядок проще понимать и поддерживать» лишены смысла без уточнения того, какой именно код на С и какой на С++.

но местным хакерам конечно виднее какой язык является более правильным.
Довольно самокритично с вашей стороны.
0
а если убрать sleep(), то scmRTOS передаст управление другой задаче?
если так можно, в каком месте какие настройки покрутить.
документацию читал, там написано что должно передаватся другой задаче, а на самом деле выполняется только одна задача.
0
Sleep должно вызываться в каждой задаче.
0
тогда это не RTOS.
0
Повесилил))
0
Сначала топаем сюда и читаем. Без знания этой доки читать дальше особого смысла нет. Дальше читаем это.
Зачем давать линки через редиректор электроникса? Оторви его, благо для этого даже %xx-ы декодировать не придется.
Также я подключал хуки за ненадобностью.
«Поотключал» быть может? А то по смыслу получается так, а написано — прямо противоположное.
Т.к. не изветно сколько в реале беде потребляться памяти и оперативки.
«будет», быть может?
0
  • avatar
  • Vga
  • 13 марта 2012, 18:35
Вот хорошая дока
electronix.ru/forum/index.php?act=attach&type=post&id=66256

Рассмотрено все необходимое. Написано простым языком.
После прочтения отпадут вопросы почему в РТОС нужно вызывать sllep.
0
  • avatar
  • a9d
  • 13 марта 2012, 19:59
Вопросов еще больше.
В доке написано:
«Все процессорное время разбито на кванты фиксированной длины. Все готовые задачи получат свой квант времени, но частота этого зависит от общего количества готовых задач и их приоритета.»
как раз тот самый sleep нужен для установки готовности задачи.
Читаем далее:
Изначально задача получает высокий приоритет. Если в течение своего кванта задача использует процессор (не блокируется с самого начала), то ее приоритет не меняется или даже повышается. С другой стороны, если задача использует свой квант полностью (не блокируется до его окончания), то ее приоритет понижается. Такая стратегия обеспечивает высокую среднюю производительность системы и быстрое время реакции для интерактивных программ (типа текстовых редакторов), но абсолютно не годится для систем реального времени, поскольку процессорное время, получаемое задачей, зависит от количества других задач и их активности.
т.е. расматриваемая scmRTOS так себя и ведет и соответсвенно не является RTOS, не текстовый же редактор пишем.
Читаем далее:
В системах реального времени обычно применяется следующий алгоритм планирования. Задачи имеют фиксированные приоритеты, которые могут динамически меняться самой задачей или планировщиком. Процессор получает задача, имеющая самый высокий приоритет. Если такая задача не одна (например, не все задачи имеют разный приоритет), то среди задач с самым высоким приоритетом организуется планирование с изменением приоритета по схеме round robin (так называемая схема RRS, round robin scheduling).
Подобная схема автоматически обеспечивает preemtion — задача с любым приоритетом (включая ядро системы) может быть прервана задачей с более высоким приоритетом.

Вот имменно что прервана, и это не происходит в scmRTOS.
А дока вообще хорошая, спасибо.
0
Не пойму как ты ее так читал избирательно что-ли.

Это ты пытаешься сказать что в scmRTOS приоритет меняется динамически? Пруфик на доку или код.
0
Что такое «пруфик»?
По поводу кода, если убрать все sleep, то получится тот код который мне нужен.
Не знаю как меняет scmRTOS приоритеты.
Я просто выяснил опытным путем что scmRTOS не является в самом прямом смысле правидьной RTOS.
Просто какой то переключатель задач по готовности и по событиям.
0
А теперь объясни какая вообще РТОС система может работать без слипов? По какому алгоритму должен диспетчер распределять процессорное время если высоко приоритетная задача всегда готова?
В РТОС системах без слипов работать невозможно.
0
Я сам хочу такую найти. Cortex-M3 можно так запустить(привелигированный режим имеется).
Диспетчер должен давать каждому процесу квант времени.Чем выше приоритет тем больше квантов давать. И естественно, что если задача закончила свою обработку должна поставить готовности с помощью sleep.
Я спрашивал сообщество может что в scmRTOS подкрутить чтобы она такой стала. Ответа на этот вопрос я не получил. Все ударились в демагогию, и я туда же.
Если не настраивается scmRTOS чтобы работать без sleep, то вопрос закрываю.
0
scmRTOS это РТОС. Тебе нужна не РТОС а многозадачная ОС. Это разные вещи.

В качестве многозадачной ОС можно использовать FreeRTOS. Нужно выключить приоритеты. Это обязательно. И тогда получится многозадачная ОС с диспетчером карусель. Но это будет многозадачная ОС а не РТОС.

В многозадачной ОС слипы можно не использовать.
0
scmRTOS это РТОС
я сильно сомневаюсь.
RTOS система реального времени, в scmRTOS пока не появится sleep другая задача не выполнится,и поэтому время реакции не предсказуемо. Как раз она на карусель и похожа.
0
Как раз без слипов оно не предсказуемо)) Но хозяин барин.
0
FreeRTOS тоже без слипов работать не будет. Без слипов ее можно запустить только в режиме карусельного диспетчера.
Еще раз повторюсь. Это будет не РТОС.
0
FreeRTOS тоже без слипов работать не будет. Без слипов ее можно запустить только в режиме карусельного диспетчера.
Еще раз повторюсь. Это будет не РТОС.
Почему это? Я прочел все документацию electronix.ru/forum/index.php?act=attach&type=post&id=66256
как раз и получается, что FreeRTOS самая RTOS.
И по ссылке www.emcu.it/STM32F4xx/Exe2_FreeRTOS_on_STM32F4-Discovery/EXE2_FreeRTOS_on_STM32F4-Discovery.html#Preemptive_ если посмотреть там задача «А» прерывается отдается время задаче «B», и задача «В» выставляет готовность и все переходит задаче «С» и все в тот же квант времени.И следущий квант времени опять отдается задаче «А».И тут сработал семафор и задача «А» опять прерывается и обрабатывается задача «D». Вот эта OS реального времени, время реакции на событие минимально. и все будет шевелится как надо и не надо думать что утебя задача длинная и пока не выполнится все остальные отдыхают.
0
FreeRTOS без перехода в состояние ожидания/сна работать не будет. Ни одна РТОС без этого работать не будет. Такое умеют только много задачные ОС.
scmRTOS это RTOS. На нее есть русскоязычная документация. Она работает также как и FreeRTOS.

FreeRTOS с диспетчером РТОС без слипов работать не будет. Диспетчер не сможет отдать управление низко приоритетным задачам.
0
Не понимаю я вас, какой смысл вы вкладываете в слово «RTOS»?
Я понимаю это как, операционная система максимально быстро реагирующая на внешие события и может обрабатывать длинные по времени задачи, которые по необходимости можно отсрочить на короткий промежуток времени.
0
Я тебе скинул документ, в котором простым языком расписана РТОС.
РТОС не быстро реагирует. У нее время реакции детерминировано.
Отсрачивать она ничего не умеет. Отсрочка это сбой или авария.
0
РТОС не быстро реагирует. У нее время реакции детерминировано.
если задача длинная и переключится нельзя о каком детерминировании можно вести речь?
0
Время реакции детерменировано а не продолжительность выполнения.
Продолжительность выполнения ни одна ОС в мире не гарантирует.
0
при чем тут время выполнения?
реакция как раз и будет равно неопределенности.
зачем тогда городить RTOS в вашем случае, если «SuperLoop» хватит.
0
Все таки прочти документацию, что я дал выше.
Все там будет детерменировано.
Для высоко приоритетной (максимальная допустимая):
время переключения контекста + время работы прерываний
Для менее приоритетной:
время переключения контекста + время работы прерываний + время работы самого длинного непрерывного участка кода высокоприоритетной.

и т.д до самого дна. Добавить изменения во время реакции могут только мьютексы и крит. секции. Но и там его легко подсчитать.
0
>>Не знаю как меняет scmRTOS приоритеты.
Никак не меняет: приоритеты задаются один раз и навсегда.
0
у меня ENTRY(Reset_Handler) стоит, но что то отладчик улетает на 0x0
0
Нашел решение сам, методом тыка, _estack в скрипте линковщика был от f103
0
но теперь попало в
loop:
B loop // Should never get here

эх… не везет мне с bare-metal (((
0
Возможно ли собрать проект в CooCox? У меня какие-то проблемы с настройкой эклипса. Спасибо!
0
Если там есть C++(Компилятор конечно там поддерживат С++), то да. Я уже не помню почему от него отказался.

Кстати вышла AVR Studio 6.0. Теперь там есть кортексы. Возможно и там можно собрать, но незнаяю как дела обстоят с отладчиком.
0
Спасибо! Завтра буду дальше разбираться. Отличная и полезная статья статья!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.