Подключение компилятора к CLion на примере Microchip XC8

Это продолжение основной статьи, тут описана только настройка IDE CLion.
Дисклеймер, вводная и пререквезиты находятся тут. Там же описана настройка VS Code.



CLion

Clion штука платная, но приятная. Имеет 30-дневный пробный период и месячную подписку в размере 10 баксов для частных лиц, что вполне терпимо, учитывая что она умеет.

Изменения в CMakeLists.txt
Начнем с простого. Добавляем в CMakeLists.txt, сразу после объявления минимальной версии, следующие строки, стыренные в одном из официальных примеров. В них мы отключаем проверку компилятора, при конфигурировании проекта CMake'ом.

set(CMAKE_C_COMPILER_WORKS 1) # Dont check XC8, it is useless.
unset(CMAKE_CXX_COMPILER) # Disable "CXX not used" warning


Custom compiler *.yaml
Для подключение не знакомого компилятора, клион требует специального файла — custom_compilers.yaml
Где он будет находиться не важно, позже мы укажем студии на него через GUI.

Иные пути, вроде использования встроенных toolchains клиона или подключения файла тулчейна в CMake результатов не дали. Там были левые флаги, ошибки и гора проблем.

Jetbrains любезно написали гайд и предоставили репу с примерами.
Стоит полазать по ним, т.к. для своего компилятора, мне пришлось сшить портянку из нескольких официальных примеров.

Спасибо поддержке Jetbrains. Без их пинка я бы не разобрался.



custom-compiler-xc8.yaml

compilers:
  - description: XC8 Compiler
    match-sources: ".*\\.c"
    match-language: C
    # Это важный момент, это не только регэксп по которому будет определен exe.
    # Судя по всему, оно проходиться через PATH и с помощью этого регэкспа 
    # так же определяет переменную ${compiler-exe-dir}
    match-compiler-exe: "(.*/)?xc8-cc(\\.exe)?" 
    code-insight-target-name: avr # сюда просят вписать наиболее похожую архитектуру. Не знаю зачем.
    # Папки с системными и процессорными инклудами.
    include-dirs: ["${compiler-exe-dir}/../pic/include/c99", "${compiler-exe-dir}/../pic/include/"]

    # Компиляторо-специфичные дефайны, прагмы и символы, 
    # чем оба поля отличаются - не знаю
    # Но во втором можно вписывать в Си стиле.
    defines:
      _DATA_ACCESS:
    defines-text: "
#define _INLINE 1
#define __XC 
#define __XC8
#define __XC8_VERSION=2000
#define __PICC18__
#define high_priority
#define low_priority
#define __interrupt(x)
#define _XTAL_FREQ=41666666
#define __bit
#define __near
"

PS: в какой момент этот файл начинает работать, мне не известно. Сам по себе, голый, он ничего не сделает, даже если тыкнуть IDE в него носом. Дальше будет описана магия и если руны будут нарисованы криво, а пентаграмма задета ногой — ничего не заработает.

Открытие проекта в IDE
Теперь запускаем IDE.
File -> Open project... и открываем корневую директорию.
Выскочит окошко настройки СMake — закрываем его.
В этот момент CMake output может выкинуть непонятные ошибки. Все ок. Еще ничего не работает.

Указание IDE на custom-compiler.yaml
Нажимаем CTRL+ALT+S, открывается окно Settings.
В дереве настроек ищем Build, Execution… -> Toolchains -> Custom compiler
Ставим галочку и указываем путь к нашему файлу.
Возможно IDE выкинет окошко, что хочет рестарта, пока игнорим.

Создание CLion тулчейна
В дереве настроек ищем Build, Execution… -> Toolchains.
В открывшемся списке клацаем плюсик, выбираем тип System.
В поле name вписываем любое имя.
В полях C Compiler и C++ Compiler вписываем путь к exe компилятора. В моем случае это:
<em>G:\Toolchains\XC8\2.35\bin\xc8-cc.exe</em>

ВНИМАНИЕ: Как сделать это переносимым или хотя бы брать из ENV, я не знаю.
Зачем это нужно, мне не ведомо. Но без эти действий бесноватый Clion откажется воспринимать ваш custom-compiler.yaml. Обратное тоже верно!
.

Создание CLion профайла CMake
В дереве настроек ищем Build, Execution… -> CMake.
В открывшемся списке клацаем плюсик или если уже есть созданный профайл — используем его.
В поле Toolchain, в выпадающем меню выбираем созданный выше тулчейн.
В поле Generator выбираем Ninja. С другими у меня работает не стабильно.
Опционально в поле Build directory указываем относительный путь для папки конфигурации и сборки CMake.

Завершение
Сохраняем, закрываем, от греха подальше перезапускаем студию.
Открываем заново и ждем начала конфигурации CMake.

Если она не началась сама — нащупываем в самом низу вкладку CMake, после чего в открывшемся окне слева клацаем шестереночку и жмем Reset Cache and Reload Project

По идее должны получить следующий аутпут:

"G:\IDE_And_Tools\JetBrains\CLion 2021.3\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Debug "-DCMAKE_MAKE_PROGRAM=G:/IDE_And_Tools/JetBrains/CLion 2021.3/bin/ninja/win/ninja.exe" -DCMAKE_C_COMPILER=G:/Toolchains/XC8/2.35/bin/xc8-cc.exe -DCMAKE_CXX_COMPILER=G:/Toolchains/XC8/2.35/bin/xc8-cc.exe -G Ninja H:\Learn\XC8_Cmake
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: G:/Toolchains/XC8/2.35/bin/xc8-cc.exe - skipped
-- Configuring done
-- Generating done
-- Build files have been written to: H:/Learn/XC8_Cmake/cmake-build-debug-system

[Finished]

Если по каким то причинам там ошибки, присутствуют всякие msvc, gcc или шланги — что то пошло не так. Что конкретно? Боюсь вам предстоит разобраться самим.

Если же все прошло успешно, при нажатии на Build All в меню сверху, должно вывести стандартный успешный аутпут сборки:
====================[ Build | all | Debug-System ]==============================
"G:\IDE_And_Tools\JetBrains\CLion 2021.3\bin\cmake\win\bin\cmake.exe" --build H:\Learn\XC8_Cmake\cmake-build-debug-system --target all
[1/3] Building C object CMakeFiles\XC8_CMake_project.dir\main.c.p1
[2/3] Building C object CMakeFiles\XC8_CMake_project.dir\gpio.c.p1
[3/3] Linking C executable XC8_CMake_project.elf

Memory Summary:
    Program space        used    86h (   134) of 1FFF8h bytes   (  0.1%)
    Data space           used     7h (     7) of   EE0h bytes   (  0.2%)
    Configuration bits   used     0h (     0) of     3h words   (  0.0%)


Build finished


Аутро

Примерно с этого момента можно начать наслаждаться удобной IDE, платить подписку и делать уже что то полезное.

Мне согласился помочь доброжелатель описав настройку под QT Creator, так что думаю в скором времени будет дополнение.
Если есть желание и возможность уточнить технические, орфографические и пунктуационные моменты или описать дополнительные проблемы, решения, тонкости — буду очень рад.

Благодарности

Спасибо множеству людей из t.me/supapro и t.me/probuildsystems слушавшим мое нытье и глупые вопросы, не скупившимся на объяснение и помощь, на протяжении нескольких месяцев, пока я осиливал несколько этих строчек конфигурации IDE.

Подключение компилятора к VS Code и CLion на примере Microchip XC8

Дисклеймер.

Это статья всего лишь нагромождение моего опыта и попыток подключения малоизвестного компилятора к IDE общего назначения, она не является руководством КАК СДЕЛАТЬ, скорее для помощи и экономии времени тех, кто имеет схожие цели.
Описываемый процесс написан чайником и предназначен для совсем чайников, может иметь имеет неточности, ошибки, использование магии и прямое вранье во имя упрощения. Если вам интересно как это действительно правильно работает и что под капотом — перепроверяйте и читайте официальные гайды.
Тут будет много «не знаю как это работает, но я так сделал и оно заработало».

Настройка CLion в отдельной статье, имеющей зависимости от этой.

Интро или «Нахрена?»

Я за время своего ковыряния с различными микроконтроллерами, не уставал удивляться насколько дефолтные IDE ужасные и отсталые при работе с кодом. Базовая подсветка и топорное автодополнение уже являются счастьем. А если они еще и работают, а подсветка ошибок не заливает пол экрана ввиду битых референсов — так вообще праздник.
И это все в то время как в Visual Studio 2019 и прочих, программисты C# объедаются вкуснейшими code snippet'ами и автодополнением, которое позволяет писать код водя бананом по клавиатуре.

К тому же многие IDE любят использовать собственную неведомую генерацию makefile и при желании хоть как то автоматизировать сборку дают 2 варианта: поддерживать 2 независимых (для IDE и внешнюю) описания сборки, либо прирастать к мейкфалу генерируемому самой IDE. Про сборку через CMake обычно даже слышать не приходиться.

Последней каплей наверно стало, когда выкупивший Atmel Microchip отказался от поддержки Atmel Studio 7, являющийся наверно самой адекватной из всего зоопарка «микроконтроллерных IDE» и стал переводить все на свою богомерзкую MPLABX полную багов, тормозов и прочего говна.

Было решено перемочь и изучить CMake хотя бы на базовом уровне, после чего совершить переезд на вменяемую студию.
Требования были следующие:
  • Восприятие внешней системы сборки без костылей и ее полная интеграция.
  • Отображение ошибок синтаксиса и сборки с свистелками и перделками.
  • Рабочая и не тормозящая проверка синтаксиса.
  • Рабочее и не тормозящее автодополнение, с зайчатками разума.
  • Отсутствие битых зависимостей и заголовочников.
  • Хотя бы какой-то контроль стиля кода.


Кандидаты

Я к своему стыду являюсь заядлым виндузятником и не могу без боли и отвращения братского понимания воспринимать линуксовские GUI, а потому, когда Eclipse отказался перемещать текстовый курсор при ПКМ, я его удалил, закончив свое знакомство на 5й минуте.

После быстрого поиска, стало ясно, что само сообщество С\С++ программистов судя по всему не особо нуждается в чем то подобном, а мои требования скорее «изнеженный каприз» презираемый опытным боевыми кодерами, хреначащими 3 каста массива указателей функций с вызовом в одну строку.

Человек не смог выйти из VIM, узнай что с ним стало...


В итоге, исключая IDE с морально устаревшими, либо не подходящими мне интерфейсами, получился очень не густой список (со спойлерами):
  • Visual Studio — лучший вариант и моя мечта. Не осилил, CMake проект завелся и собрался, но с кучей ошибок и потерянных зависимостей в самом редакторе. Добиться чего-либо от офф поддержки невозможно. Обещают в 2022 качественный завоз поддержки эмбеддед, но пока все очень не понятно и криво. Гуглятся какие-то официальные стать, где для VCPKG, VCPKG И ГОТОВО!
  • VisualGDB for Visual Studio — плагин, который хочет денег, магически делает все хорошо, но завязывает вас на себе и на собственной структуре проекта с разбиением *.h и *.с файлов в разных папках, делает полную реконфигурацию проекта по каждому чиху, что на проекте из 100-200 файлов может занимать минуты, дико тормозит и любит ломаться. Пробовал еще давно — ну нахрен.
  • Visual Studio Code — успех, но ввиду жабс родословной, отказался ввиду того, что не умеет искать ошибки в закрытых файлах, не умеет в вменяемый docking и самое важное — не умеет refactoring-rename между файлам, что и поставило жирный крест.
  • CLion — успех, но просит денех. Несмотря на платность, имеет на мой взгляд кучу недостатков, например так же не умеет в полноценное второе окно и docking всяких радостей в него.
  • QT Creator — так и не заставил себя попробовать. ПТСР от эклипса еще очень свежо.


Пререквизиты

То, что я имел в начале.
  • Установленные и работающие из под консольки система автоматизации сборки CMake и собственно система сборки Ninja
  • Ваш компилятор, который успешно вызывается в консольки без указания пути, а значит внесенный в системную переменную PATH
    
    PS C:\> xc8
    G:\Toolchains\XC8\2.35\pic\bin\picc
    Microchip MPLAB XC8 C Compiler V2.35
    Build date: Dec  6 2021
    Part Support Version: 2.35
    Copyright (C) 2021 Microchip Technology Inc.
    (880) invalid number of parameters. Use "XC8 --HELP" for help
    (908) exit status = 1
    

  • Toolchain.cmake файл вашего компилятора для кросс компиляции — я делал свои, но они получались очень кривенькие и косые, в итоге, нашел проект, которым и воспользовался. CMake XC8 Toolchain. Скорее всего для вашего компилятора есть что то похожее. Иначе — придется разобраться самому, к сожалению, вменяемой инфы для быстрого старта очень не густо.
  • Проект, использующий этот Toolchain.cmake и собираемый CMake из консоли.

Проект содержит простейший цикл, который задействует заголовочные файлы процессора и т.н. системные заголовочные файлы.
Этот код не предназначен для работы в железе, прерывание никогда не выстрелит, только для демонстрации работы IDE.
gpio.h вынесен не просто так, позже на его примере будет показана проблема и ее решение.


main.c

#include <xc.h>        	/* PIC MCU headers */

#include <stdint.h>		/* System lib headers */
#include <stdbool.h>     

#include "gpio.h"

volatile uint8_t i = 0;

void __interrupt(low_priority)  LowISR(void)
{
   i = 0;
}

void main(void)
{	
    while(1) {
      i++;
      bool is_some_condition = (i == 0);
		
      if(is_some_condition ) { SetGPIO(true); }
      else { SetGPIO(false); }
   }
}

gpio.c\h

#include <xc.h>
#include <stdbool.h>

void SetGPIO(bool new_state)
{
   LATCbits.LATC2 = new_state;
}



И CMake файл, с простейшими указаниями.
cmake_minimum_required(VERSION 3.20)
set(CMAKE_TOOLCHAIN_FILE external/cmake-microchip/toolchain.cmake)
set(MICROCHIP_MCU PIC18F97J60)
project(xc8-cmake C)
set(TARGET_NAME "XC8_CMake_project")
add_executable(${TARGET_NAME} main.c gpio.c gpio.h)


Внимание к cmake_minimum_required(VERSION 3.20), у меня при версии выше 3.21 выдавались очень не понятные ошибки, слабо указывающие на зависимость от этого параметра. Может «шарящим» людям ясно из-за чего, но для меня это магия, в которую я пока не погружался.

set(CMAKE_TOOLCHAIN_FILE external/cmake-microchip/toolchain.cmake)
Это магическая переменная CMake, куда загружен относительный путь к моему Toolchain файлу.

set(MICROCHIP_MCU PIC18F97J60) Определение процессора, для которого производится сборка. Это требует конкретно мой тулчейн.

Все это дело, я собираю из консоли простейшими командами.
cd C:/path/to/my/project/folder
cmake -S ./ -B ./build -G "Ninja"
ninja -C ./build


Где:
  • cmake -S ./ -B ./build -G «Ninja» инициализация CMake (не спрашиваете, что это, я не знаю)
  • "-S ./" относительный путь к файлу CMakeLists.txt, который в моем случае находится в корне проекта.
  • "-B ./build" относительный путь к директории, куда будет произведена инициализация CMake.
  • "-G «Ninja» указание генератора, модные хипстеры говорят мейкфайл говно, а ninja круто, так что выберем этот симплдимпл.
  • «ninja -C ./build» запуск сборки, где "-C ./build" путь к директории с сгенерированными файлами.

И собственно как итог всего действа:

PS H:\Learn\XC8_Cmake> cmake -S ./ -B ./build -G "Ninja"
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: G:/Toolchains/XC8/2.35/bin/xc8-cc.exe - skipped
-- Configuring done
-- Generating done
-- Build files have been written to: H:/Learn/XC8_Cmake/build
PS H:\Learn\XC8_Cmake> ninja -C ./build
ninja: Entering directory `./build'
[3/3] Linking C executable XC8_CMake_project.elf

Memory Summary:
    Program space        used    86h (   134) of 1FFF8h bytes   (  0.1%)
    Data space           used     7h (     7) of   EE0h bytes   (  0.2%)
    Configuration bits   used     0h (     0) of     3h words   (  0.0%)

PS H:\Learn\XC8_Cmake>


На этом мы имеем проект, собирающийся из консоли. Который будет использован как базовый, для подключения к различным IDE.

Visual Studio Code

Помимо самой студии, потребуется установить минимум 2 расширения.
  • C/C++ for Visual Studio Code от Microsoft
  • CMake Tools от Microsoft

Сама студия имеет несколько дополнительных сущностей.
*.code-workspace файл, который фактически является файлом проекта и содержит настройки «всей фигни» для работы в VS Code.
.vscode директорию, где в отдельных *.json хранятся настройки конкретных плагинов или куски настроек выдранные из *.workspace
Вроде! Все можно вписывать и в файл воркспейса, предварительно создав map'ы с именами аналогичные именам файлов в .vscode, но это не точно. Другие причины, кроме удобства подобного разбиения, мне не известны.

И так, первым делом, надо Open folder... корень проекта, после чего Save workspace as ..., что создаст файл воркспейса.
Во время открытия, студия будет спамить всплывающими окнами, в том числе предлагая сконфигурировать проект под CMake — отказывается или игнорим. У меня такая штука сломала все труды и я так не разобрался почему, потратив несколько часов, закончившиеся очищением того, что оно добавило в конфиг.

После чего можно оглядеть проект из IDE.

Глядя в окно output, можно увидеть, что CMakeLists.txt автоматически подцепился и сконфигурировался.
А ПКМ по CMakeLists.txt -> Build All Projects даже запустит и успешно завершит сборку. Казалось бы успех…

Но если чуточку поковыряться, можно заметить:
  • xc.h не найден, а значит никакого автокомплита по регистрам и макросам компилятора и самого МК.
  • Синтаксические ошибки не будут подсвечены, кроме ошибок поиска заголовочных файлов. И это проблема. VS Code не будет задействовать intellisense пока не будут разрешены ошибки заголовочников. (но даже если вы их разрешите — см. ниже)
  • Прагмы, дефайны и спецсимволы компилятора аля __interrupt(low_priority) будут неизвестны и в лучшем случае светится ошибкой, в худшем рушить синтаксические конструкции и вызывать кучи ошибок в самых неожиданных местах.
  • Системные заголовочники будут видимы, но при CTRL+ЛКМП по ним, вы попадете в папку какого-нибудь MSVC. В принципе с этим нет проблем, интерфейс стандартных библиотек везде одинаковый, а их использование IDE, не значит их использование компилятором, как и наоборот, вот этот момент надо всегда держать в уме. Но проблема в том, что там могут быть не только системные, но и другие заголовочные файлы, у меня это был gpio.h Что вызывало невидимость void SetGPIO(bool new_state)
    для IDE и ошибку отсутствия определения. У вас похожая проблема может не возникнуть или возникнуть не сразу.

Ок. Пытаемся решить.
ВНИМАНИЕ: Студия жабсовая и дурная, она может менять настройки при сохранении файла, а может хотеть рестарта, а может вообще их применять спустя несколько десятков секунд, потому что пошел на хрен.
Благо перезапускается она за секунды.

Для начала надо в файле воркспейса вписать строку, включающую отображение ошибок C++, что бы получилось так:
{
	"folders": [
		{
			"path": "."
		}
	],
	"settings": {
		"C_Cpp.errorSquiggles": "Enabled",	// Включить отображение ошибок???? 
		"C_Cpp.intelliSenseUpdateDelay": 500,	// Задержка после редактирования файла, перед началом парсинга intellisense.
		"C_Cpp.intelliSenseEngineFallback": "Enabled",	// Не знаешь - не трожь!
		"C_Cpp.autocompleteAddParentheses": true, // Описание при наведении
	}
}

В отдельности это ничего не изменит, но потребуется для дальнейшего. (а может не потребуется, черт знает)

Далее, в корне проекта, в папке .vscode надо создать файл c_cpp_properties.json. Если папки не появилось, это норма, ее надо создать руками.
И копируем туда следующий жабсон код
{
    "version": 4, // Версия жабсон, спросите у фронтендеров зачем она

    "configurations": [
        { 
            "name": "Win32",    // Указание платформы компилятора, хз на что влияет. Не знаешь - не трогай!
            "includePath": [    // Пути где Intellisense будет искать заголовочники (** значит рекурсивно всю внутрянку)
                "${workspaceFolder}/**",                // Корень нашего проекта
                "G:/Toolchains/XC8/2.35/pic/include/**" // Заголовочники компилятора
            ],

            // Файлы которые будут считаться заинклуженными поверх всех остальных.
            // Исправляем зависимость от MSVCшного gpio.h
            "forcedInclude": [
                "${workspaceFolder}/gpio.h"
            ],
            
            // Определенные символы, которые будут включены по принципу
            //  #define ${string}
            // Причем просто имя задефайнит его единицей, для пустого дефайна надо поставить "="
            "defines": [
                "_DEBUG",       // #define _DEBUG 1
                "__XC",         // #define __XC 1
                "__XC8",
                "__XC8_VERSION=2000",   // #define __XC8_VERSION 2000
                "_18F97J60",
                "__PICC18__",
                "high_priority=",       // #define high_priority
                "low_priority=",
                "__interrupt(x)=",      // #define __interrupt(x)
                "_XTAL_FREQ=41666666",  // #define _XTAL_FREQ 41666666
                "__bit=",               // #define __bit
                "__near="
            ],
            // Путь до exe компилятора, вообще он не очень то здесь и нужен. (вроде)
            "compilerPath": "G:/Toolchains/XC8/2.35/bin/xc8-cc.exe",
            "cStandard": "c99",
            "cppStandard": "c++98",
             // Как-то влияет на режимы intellisense, при наличии 
             // дурных ошибок подсвеченных в IDE, которые однако без проблем съедает компилятор, стоит попробовать поиграться этим значением.
             // Варианты должно быть можно вызвать через CTRL+SPACE
            "intelliSenseMode": "clang-x86",

            // Путь к файлам, которые подвергаются парсингу intellisens'ом
            "browse": {
                "path": [
                    "${workspaceFolder}/**",
                    "G:/Toolchains/XC8/2.35/pic/include/**" // Заголовочники компилятора, почему 2 раза? Иначе не работает!
                ]
            }
        }
    ]
}


После этого основные мои проблемы с VS Code закончились. Скорее всего у вас буду ваши, свои собственные, возможно описанное выше не решит их, но пусть оно будет хотя бы дополнительной информацией.

«Ментальные вызовы» VS Code

Помимо основных проблем, были еще мелкие:

1. Intellisense ТОРМОЗИЛЛЛллллллл, между изменением файла и окончанием парсинга проходили десятки секунд. Увы нормально не лечится, на гите вскода тикеты висят годами, после чего ехидный модер их закрывает с пометкой «наверно само вылечилось уже», но их позже переоткрывают энжой йор жабс. У меня была проблема, что заголовочники компилятора обильны и велики числом, особенно заголовки самих МК. В итоге, специально для IDE, я вынес их в папку с проектом, обрезал там все, что не требовалось моему процу и перенаправил пути инклудов IDE в жабсон туда.
2. Отображение ошибок лишь в открытых файлах. Не лечится. На гите вскода сказали, что и не будет в ближайшем будущем. энжой йор жабс
3. Отсутствие Refactor -> Rename по всему проекту. См. пункт 2. энжой йор жабс

Аутро

После микропроблемы пункта 3, была в ярости удалена, а ярость перенаправлена в русло борьбы с CLion, которое вроде завершилось успехом и будет описано позднее.
А вот и она.

Примерно с этого момента можно начать наслаждаться удобной IDE, платить подписку и делать уже что то полезное.

Мне согласился помочь доброжелатель описав настройку под QT Creator, так что думаю в скором времени будет дополнение.
Если есть желание и возможность уточнить технические, орфографические и пунктуационные моменты или описать дополнительные проблемы, решения, тонкости — буду очень рад.

Благодарности

Спасибо множеству людей из t.me/supapro и t.me/probuildsystems слушавшим мое нытье и глупые вопросы, не скупившимся на объяснение и помощь, на протяжении нескольких месяцев, пока я осиливал несколько этих строчек конфигурации IDE.

Уже не такой простой диспетчер с динамической очередью задач для PIC12F/16F

Доброго времени суток. Опять я со своими ассемблером и ПЫК16. Вот наконец-то, как и запланировал, дописал свою «Недо ОС» на ассемблере под Пики. Кому интересно, с чего начиналось — могут почитать здесь: we.easyelectronics.ru/Gnusmas/prostoy-dispetcher-s-fiksirovannoy-ocheredyu-zadach-dlya-pic16.html

В этой итерации я шагнул гораздо дальше. Настолько дальше, что следующей итерацией должно уже быть что-то на Си. Но я все же прошу заглянуть адептов асcемблера и высказать свое 'фе' по поводу качества и функционала моего кода, чтобы я был твердо уверен, что выжал все, что можно было.
Из того что усовершенствовано по сравнению с предыдущим проектом:
  1. Очередь задач из фиксированной переделана в динамическую, в виде кольцевого буфера, размер котрого задеться в файле настройки ОС
  2. Проект «Недо ОС» разбит на несколько файлов: файл «ядра», файл задач, файл настройки ОС, файл макросов общего употребления
  3. Все возможные настройки системы упакованы в макросы и по максиму автоматизированы. То есть расчитано, что Вы зайдете в файл настройки системы Nedo_OS_v1.4.h, внесете в него необходимые Вам параметры ОС, а дальше все само подстроится и создастся. Вам останется только написать обработчик для каждой Вашей задачи.
  4. Исправление банальных ляпов вроде переписи содержимого таймера в конце, а не начале обработчика прерывания, что устраняет неравномерность возникновения прерываний при разном количестве таймеров, и прочие мелочи.

Сейчас проект (8 светодиодов мигают каждый со своей частотой) занимает 269 слов памяти программ и 52 байта ОЗУ, влазя таким образов во все 12F и 16F камни. На 16F84 остается 755 слов памяти программ (3/4 доступного объема) 16 байт ОЗУ (1/4 доступного обьема). Как видим, добавление очереди задач в виде кольцевого буфера и номера целевой задачи для каждого таймера съело львиную долю ОЗУ. Замечания и пожелания приветствуются.

Подключение экрана ILI9341 к pic24

PIC
Недавно приехал ко мне этот девайс, подключил к pic24fj64gb004, нарисовал линии, круги, как то все уныло, захотел выводить изображение, зря что ли покупал, тем более что контроллер позволяет работать с USB флешкой, выкопал микрочиповское демо, поправил под свой контроллер, дописал прошивку, подпаял экран, воткнул флешку и все заработало, описание экрана можно без проблем найти в сети так что вдаваться в дебри что там и как вдаваться не буду, шина работает на частоте 16 мгц, все это конечно скоростями не поражает, все таки 16мгц и отсутствие DMA скорости не прибавляют :-).
видео процесса вывода
youtu.be/ezIEmxJ4txk
вследствии недостаточного размера памяти и быстродействия контроллера, картинки переконвертированы в формат RGB565 и записаны на флешку, программа читает содержимое файлов и выводит на экран,
в main

 while(1)
    {
      USBTasks();

        if(USBHostMSDSCSIMediaDetect())
          {
           deviceAttached = TRUE;
           LED0_IO=1;
           
          if(FSInit())
            {
             if(TickGet() - t >= TICK_SECOND*2)
                {
                  t = TickGet();
                  i++;
                }
             switch(i){
                case 1:TFT_FillScreen(BRIGHTGREEN);
                     break;
                case 2:TFT_FillScreen(BRIGHTBLUE);
                     break;
                case 3:TFT_FillScreen(BRIGHTCYAN);
                     break;
                case 4: TFT_FillScreen(MAGENTA);;
                     break;
                case 5: TFT_FillScreen(YELLOW);
                     break;
                case 6:  TFT_FillScreen(BLACK);;
                     break;
                case 7:TFT_FillScreen(CYAN);;
                     break;
                case 8:TFT_FillScreen(DARKGRAY);;
                     break;
                case 9:TFT_FillScreen(BRIGHTRED);
                     break;
                case 10:
                    
                    myFile = FSfopen("1.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);
                      

                   break;
                  case 11:


                      myFile = FSfopen("2.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 12:
                    
                        myFile = FSfopen("3.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 13:
                     
                        myFile = FSfopen("4.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 14:
                     
                        myFile = FSfopen("5.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 15:
                    
                   myFile = FSfopen("6.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                  case 16:
                    
                      myFile = FSfopen("7.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 17:
                   
                        myFile = FSfopen("8.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 18:
                  
                        myFile = FSfopen("9.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 19:
                  
                        myFile = FSfopen("10.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 20:
                    
                        myFile = FSfopen("11.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);
                   break;
                   case 21:
                   
                        myFile = FSfopen("1.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);
                      i=1;
                   break;
                 }

если устройство подключилось, инициализируем файловую систему, потом по таймеру выводим изображения.

Лабораторные работы на МК PIC или версия "БЫСТРОГО СТАРТА"

PIC
Когда то, давным давно… В далекой галактике....


Читать дальше
  • +8
  • 29 сентября 2014, 15:01
  • ppram5
  • 1

Arriba. Ещё одна IDE.

PIC


На сайте микрочипа появилась IDE Arriba, основанная на Eclipse. Для любителей оригинального Eclipse есть возможность установить Arriba-plugin + Arriba Connect отдельно (некий софт, связывающий GDB и микрочиповские программаторы-отладчики).



Всё бы хорошо, но…
Бесплатная версия поддерживает только PicKit 3 + Simulator. Для обладателей шайб (ICD2, 3) требуется Enterprise Edition по прекрасной цене 495$.

Что можно сказать? Сначала микрочип взяли опен-сурсный gcc и перепилили его в свою серию компиляторов XC и теперь продают за денежку, но и этого оказалось недостаточно. Теперь можно к опен-сурс IDE продавать ПО для работы с их контроллерами. Браво чтоль…

Из плюсов: возможно в скором это ограничится не только прикручиванием к Eclipse, но и к другим IDE, например QtCreator, C::B и т.д.
  • +2
  • 02 сентября 2014, 10:59
  • becopt

одноразовый usb pic программатор из ft232, ft245, ft2232

Пытаясь прокачать свой tl866cs до более дорогого с исп выходом, я залил в него загрузчик, который был выковырен одним участником форума vrtp.ru. А у программатора этого есть серийник и номер устройства, которые наверное теперь отслеживаются китайцами и в новых обновлениях могут быть заблокированы.
Прошить загрузчик я прошил, а второй программатор уже продал, решив оставить себе прокачанный.
Т.к. пиками я не занимаюсь, то отдельного у меня не было, а платить 5 евров было жалко и ехать далеко до магазина.

И тут внезапно оказывается есть программатор под лпт, причем он работает с картами pci, надо тамт олько указать адрес карты.
И там же есть PICPgm USB Programmer, который сделан на ft232.
У меня нет нет 232, зато есть пинборд2 с тф2232. А это по сути 2хфт232.

Подключаем.


В настройках софта выбираем усб программатор, а напротив номеров выводов снимает все галки инвертирования. Потом замыкаем data in с data out. Теперь софт определяет наш программатор.
Более того, софт может автоматом определять контроллер.
У меня он определил все и прошил.

И вот тут кроется его одноразовость. По каким-то причинам фтшка работает очень медленно. Скорей всего потому, что автор использует bit bang вместо настоящего спи, который можно гнать аж до 24мгц вроде бы или выше.
Поэтому такой вариант хватит разве что прошить загрузчик. 128к программатор читает около 3х минут.

Не забудьте, что некоторые пики 18й серии работают только от 3.3в и на пинборде надо переключить джампер питания i\o на 3.3в.

Если вы хотите прокачать свой tl866cs, то вам нужен апдейтер bit.ly/YaJYDq
Вроде бы он не требует стороннего программатора или же генерит прошивку с нужным конфигом и ее надо самому заливать.

О погоде. Ethernet-метео с вертикальным взлётом.

Есть у меня знакомый Слон.
И делает этот Слон эзернет-термометры.
вот такие:



Читать дальше

Счетчик электроэнергии 2х тарифный

Накрылся 2х тарифный квартирный счетчик, не проработов и 2х лет. Похоронив вместе с собой показания потребления за полгода (вынуть, я подозреваю, их можно, читаем далее как. но куда в нашем совке их предъявишь). Разбераем прибор и смотрим, что и как внутри.



подкат
  • +1
  • 26 сентября 2012, 11:57
  • EnTuTb

Extra-pic

Под катом плата в eagle и модель в sketchup.Зачем я это сделал? Да просто захотелось что-то собрать, потравить, спаять и в SketchUp порисовать.

Читать дальше