Jump to content

    

Integro

Свой
  • Content Count

    334
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Integro

  • Rank
    Местный
  • Birthday 04/13/1988

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Минск

Старые поля

  • skype
    deniska_igorevich
  • Vkontakte
    http://vk.com/krasutski_denis
  • LinkedIn
    https://www.linkedin.com/in/denis-krasutski-721865104/

Recent Profile Visitors

2486 profile views
  1. STM32L476 + SD. f_write выдает FR_DISK_ERR

    Объект это ведь &outFile, нужно смотреть в эту сторону...
  2. Операционная система.

    ARM это широкое понятие и никак не соотносится с ModBus. Готовый "стек"( стек громко сказано) работы с ModBus можно запустить и на AVR и PIC ограничения только в ресурсах микроконтроллера. Нужно знать особенности ядра (32битная архитектура, используемые регистры, стеки MSP, PSP), знать нюансы работы с контроллером прерываний, понимать как обрабатывать XXX_fault ы , знать о таких хардварных ускорителях как prefetch, cache, понимать что из cебя представляют MProtectionU, MMU. А дальше, уже по мере необходимости посматривать в даташит на периферию и примеры работы с ней. Есть разработчики которые пишут прикладное ПО для Windows, есть те кто разрабатывает драйвера или ядро Windows. Одни могут не понимать как работает компьютер, вторые же, без этих знаний работать не смогут. Тоже самое с микроконтроллерами Вы можете использовать готовый стек работы с каким либо железом и не заморачиваться, при этом будите ограничены предоставляемым функционалом и возможно даже не потеряете в производительности. Все зависит от вашей задачи и условий... OS в мире микроконтроллеров в своем большинстве, предоставляют только механизм реализации потоков(задач) + набор механизмов для взаимодействия между потоками(очереди, мьютексы, события, критические секции и тд). Да есть OS с прикрученными (или дополнениями) типо file system и sockets с очень схожим API но нигде нет стандатрного интерфейса работы с например PWM, I2C и тем же MAC для ethernet. По этому ваша высокоуровневая логика обычно требует еще слой абстракции для безболезненного переноса с одного контроллера на другой, если конечно, в этом есть необходимость
  3. Вот с этого нужно было начинать :) В итоге можно получить VERSION_STRING REVISION как строку но опять при помощи компилятора и через массив char заполняя его нужными символами, минус такого исполнения только один, выглядит криво, не так красиво как это мог сделать препроцессор.
  4. Если эти переменные не нужны и нигде не используются, достаточно добавить ключевое слово static в объявления и линкер не положит эти переменные в выходной бинарь. Как раз под рукой ARMCC(ARM Compiler 5.06 update 5 (build 528)), результирующая информация(без какой либо оптимизации): const uint32_t _day = BUILD_DAY; const uint32_t _month = BUILD_MONTH; const uint32_t _year = BUILD_YEAR; //Выхлоп: //Total RO Size (Code + RO Data) 6988 ( 6.82kB) //Total RW Size (RW Data + ZI Data) 12284 ( 12.00kB) //Total ROM Size (Code + RO Data + RW Data) 7012 ( 6.85kB) static const uint32_t _day = BUILD_DAY; static const uint32_t _month = BUILD_MONTH; static const uint32_t _year = BUILD_YEAR; //Выхлоп: //Total RO Size (Code + RO Data) 6976 ( 6.81kB) //Total RW Size (RW Data + ZI Data) 12284 ( 12.00kB) //Total ROM Size (Code + RO Data + RW Data) 7000 ( 6.84kB) Минус 12 байт!
  5. Уважаемый @jcxz 1. Вопрос я задавал не Вам, и ваши догадки, вероятно, никак не коррелируют с мыслю автора 2. Ваш пример несостоятелен
  6. Так не зависимо от того это #define "Some text" или const char text[]="Some text" строка с текстом будет будет храниться на Flash. Или речь о чем еще?
  7. Виноват, про строку что-то сразу не заметил. Но если действительно нужно сформировать строку в compile time здесь уже может помоч компилятор: #define BUILD_DATE (BUILD_DAY << 24 | BUILD_MONTH << 16 | BUILD_YEAR) #define BUILD_DAY ((uint32_t)((__DATE__[4] == ' ')?(__DATE__[5] - '0'):((__DATE__[4] - '0')*10 + (__DATE__[5] - '0')))) #define BUILD_MONTH ((uint32_t)((__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')*1 + \ (__DATE__[0] == 'F' && __DATE__[1] == 'e' && __DATE__[2] == 'b')*2 + \ (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')*3 + \ (__DATE__[0] == 'A' && __DATE__[1] == 'p' && __DATE__[2] == 'r')*4 + \ (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')*5 + \ (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')*6 + \ (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')*7 + \ (__DATE__[0] == 'A' && __DATE__[1] == 'u' && __DATE__[2] == 'g')*8 + \ (__DATE__[0] == 'S' && __DATE__[1] == 'e' && __DATE__[2] == 'p')*9 + \ (__DATE__[0] == 'O' && __DATE__[1] == 'c' && __DATE__[2] == 't')*10 + \ (__DATE__[0] == 'N' && __DATE__[1] == 'o' && __DATE__[2] == 'v')*11 + \ (__DATE__[0] == 'D' && __DATE__[1] == 'e' && __DATE__[2] == 'c')*12)) #define BUILD_YEAR ((uint32_t)((__DATE__[7] - '0')*1000 + (__DATE__[8] - '0')*100 + (__DATE__[9] - '0')*10 + (__DATE__[10] - '0'))) #define DIG_TO_CHAR(d) ((d)+'0') const uint32_t _day = BUILD_DAY; const uint32_t _month = BUILD_MONTH; const uint32_t _year = BUILD_YEAR; const char __DATE_RUS_FORMAT__[]= {DIG_TO_CHAR(_day / 10), DIG_TO_CHAR(_day % 10), '.', DIG_TO_CHAR(_month / 10), DIG_TO_CHAR(_month % 10), '.', DIG_TO_CHAR(_year / 1000 % 10), DIG_TO_CHAR(_year / 100 % 10), DIG_TO_CHAR(_year / 10 % 10), DIG_TO_CHAR(_year % 10), '\00'}; Как по мне, решение выглядит уродливо, но __DATE_RUS_FORMAT__ лежит уже расчитанный в секции с константами printf("Build date: %s\n",__DATE_RUS_FORMAT__); //Output: Build date: 19.04.2019
  8. Какой компилятор?
  9. Плюсую, должно работать!) Как уже сказали, на этапе компиляции может вычислятся значение константы, а вот в результате работы препроцессора(для макроса выше, const u32 day = BUILD_D;) должно выйти что-то типо этого: const u32 day = ((u32)(("Apr 17 2019"[4] == ' ')?("Apr 17 2019"[5] - '0'):(("Apr 17 2019"[4] - '0')*10 + ("Apr 17 2019"[5] - '0')))); И как уже сказали, такое удобно смотреть в листинге препроцессора, флаг"-Е" для armcc и gcc (по дефолту результат положит в объектный файл и дальше компиляция будет остановлена с ошибкой) и опция generate preproccesor output для IAR, будет создан отдельный файл с расширением .i
  10. Покажите нам (лучше двумя скринами отладчика) где и в какой момент при чтении эти значения отличаются + содержимое вашего внутреннего флеша (через окно memory)
  11. STM32L152VBH6A перепрограммирование.

    На каком пине светодиод?
  12. Я кстати тупанул, пишу BlueNRG-1 думаю о BlueNRG BlueNRG - Bluetooth® low energy wireless network processor, (Not recommended for New Design) BlueNRG-MS Bluetooth Low Energy Network Processor supporting Bluetooth 4.1 core specification MS-MasterSlave BlueNRG-1 Bluetooth Low Energy System On Chip(не нужен хост контроллер) BlueNRG-2 Bluetooth® low energy wireless system-on-chip(не нужен хост контроллер) BlueNRG-2 от BlueNRG-1 отличается большим размером флеш(256 против 160кБ), и заявлена совместимость с ядром 5.0. Оба могут работать как master\slave
  13. Bluetooth 4.0 понятие широкое, c учетом того что BlueNRG-1 это BLE, подозреваю что вопрос о BLE ну и исходя из неточности вопроса позволю себе легкий экскурс в BLE. Подход работы BLE отличаться от классического Bluetooth. Таких профилей как в обычном BT в BLE по сути нет, в BLE подключение предоставляет доступ к такой сущности как характеристика, набор характеристик объединяться логической группой называемой сервисом. Вот эти вот сервисы, стандартизированы но можно создать и использовать свой custom. Размер одной характеристики для BLE 4.0 не может превышать 20байт, кол-во характеристик ограничивается ресурсами контроллера в этом кстати один из минусов BlueNRG, там фиксированное MAX кол-во характеристик в отличии от nRF52 или EFR32, (у ST есть еще SoC BlueNRG-2, но не могу сказать о возможностях его стека) Максимальная скорость передачи данных может в разы зависеть от смартфона. Для BLE все одинаково организовано не зависимо от набора сервисов, там нет таких проблем как с BT, если есть конект, ПО имеет доступ к характеристикам их можно читать, писать получать нотификации об изменении. Это одинаково работает как на Android так и на Iphone без всяких там танцев с лицензиями и тд. В BLE кстати, понятие pairing стало опционально, если вам не нужно шифровать данные на уровне BLE канала, от pairing можно отказаться. Как уже было сказано, очень много простых примеров у Nordic в их SDK, при работе с BlueNRG подход для создания характеристик и передачи данных тот же но понятно, другой API. Со стороны смартфона у Nordic есть примеры для Android и Iphone Говоря про чип BlueNRG-1(MS) вполне себе рабочая IC, но SDK(API) субъективно "грязное", есть warnings при компиляции, code style плавает, постоянно появлялись какие то нюансы, приходилось писать в поддержку... nRF5x много приятнее, хорошая инфраструктура, любая проблема гуглиться за раз, можно купить уже в сертифицированном модуле.
  14. PIC16F690+MPU6050

    Никаких. SRAM'a и FLASH'a конечно маловато, но работать можно. Вообще отличная задача чтобы прочувствовать весь смак работы с ассемблером. Вторым этапом, для самообразования, я бы порекомендовал повторить это на Си Не уверен влезет ли С скомпилированный код в данный контролер но зато одни функции пересчета координат так красиво, в пару строк лягут... :)
  15. Да, давно!) но поддержка появилась только в С++11, чистый С (C89, C99, C11) такого еще не умеет