Pull to refresh

Comments 40

Давно не читал столь подробного обоснования того, что винда — зло))))
интересный у вас фокус восприятия. вы уверены, что статья об этом?
анекдот один напоминает

Пункт "Что не так в Eclipse / SW4STM32" меня очень удивил. Использую Эклипс для разработки под STM32 (CubeMX), Avr и прочий веб. Для каждого типа проекта имеется Custom Perspective, т.е. при работе с STM32 нету тулбаров от Avr и т.п. "полной пересборки (Clean and Build) как единой команды нет" называется Rebuild Project.
Но не без стакана дёгтя, разумеется, но он в обзор не вошёл...

это прекрасно, что можно настроить под себя. проблема в том, что любая настройка, как отключение перспектив или восстановление скрытых пунктов меню, каждый раз требует гугла и 10 мин долботни. посмотрите, например, как включить тулбар по умолчанию, чтобы он не исчезал при перезапуске.
кстати в NB спец-окна и тулбары активируются при помощи плагинов, при этом основная раскладка остается прозрачной между всеми режимами.
Rebuild Project после вашей подсказки нашел, в горячих клавишах (которые тоже почему-то настраиваются в свойствах окон (Windows->Preferences), как и все остальные системные настройки). в меню Project, как и в контекстном меню проекта, этого пункта нет. ну ОК, забиндил на Ctrl+F10 как у себя в NB/MPLabX. в фокусе редактора вместо пересборки открывается контекстное меню, в фокусе панели проектов — активируется верхнее меню. с контекстным оказывается — конфликт горячей комбинации, о чем Eclipse вежливо умолчал. устраняю. теперь верхнее меню активируется всегда, по Ctrl+F10. пересборка так и не работает. все, спасибо.
с этим сталкиваешься в первые полчаса использования среды. копать глубже уже как-то и смысла по-моему нет

"Как включить тулбар.." ниразу не сталкивался, хотя вопрос довольно старый…
Ну и за первые полчаса можно включить, например, готовый набор горячих клавиш, в комплекте есть Visual Studio и что-то там еще, кажется, Emacs :). Ну и полнотекстовый поиск по горячим клавишам имеется. Сейчас проверил кейс с Ctrl-F10, результат:


  1. Linux — работатет как заказано.
  2. Windows — активируется меню. По Ctrl-F10 у меня во всех приложениях активируется меню… хмммм...

Вывод: Windows must чего-то там. Не агитирую за советскую власть, но любая среда требует настройки, и не по полчаса, а как бы в процессе работы. В своё время я "ниасилил" настройку NetBeans от слова совсем, примерно вот как вы сейчас неделю обсуждаете как пропатчить gdb под netbeans, так и я провозился с какой-то ерундой, которая очень мне мешала комфортно работать. Долботня она везде, но у каждого своя.

Вы не пробовали посмотреть, как устроен в этом месте https://gnu-mcu-eclipse.github.io/?
Тот же набор в виде OpenOCD (или Segger JLink, по желанию) + GDB, и всё "само" работает.

вроде вариант решения нашелся (ниже), но если не сработает, буду иметь в виду.
в принципе, сам Eclipse можно наверное глянуть в исходниках, т.к. все отладочные платфрмы на GCC (даже десктопные) по идее должны использовать этот же механизм
Можно ещё делать так:
gdbinit:
shell start "OpenOCD" openocd
shell start "OpenOCD telnet" telnet localhost 4444
target extended-remote localhost:3333

openocd.cfg:
#Exit on gdb-detach
$_TARGETNAME configure -event gdb-detach { shutdown }

В telnet консоли можно вводить команды OpenOCD, в том числе init
Makefile удобнее свой использовать, или STM32CubeMX умеет генерировать
Вместо Ctrl+C использую команду halt
Для перезапуска reset (halt/run/init)
из консоли все работает, включая Ctrl+C для прерывания.
сложность была в том, чтобы управлять из-под NetBeans
У меня управляется всё из NetBeans, собственно кроме ввода halt.
При этом не нужно вручную запускать openocd и делать Attach
Есть ещё вариант использовать pipe
target remote | openocd -c "gdb_port pipe; log_output openocd.log"
GDB and OpenOCD
у меня при запуске OOCD через скрипт GDB как-будто сразу рвется связь. в окне Sessions — Process ID = -1 и Process State = Exited. кнопки отладки остаются, но все заблокированы, кроме завершения сеанса
Надо смотреть логи oocd и gdb, всего скорее произошла ошибка.
Вот пример проекта, с моими настройками
LCDTest
Решали эту проблему для одного из проектов, в итоге остановились на самописном плагине, который создает «свою» кнопку останова (согласен, не лучший вариант), вызывающую следующую утилиту на C++ (и передающую ей PID arm-none-eabi-gdb процесса):

#include "stdafx.h"
#include <windows.h>

int main(int Argc, char** Argv)
{
	if (Argc != 2)
		return 1;
	int consolePid = atoi(Argv[1]);
	FreeConsole();
	AttachConsole(consolePid);
	GenerateConsoleCtrlEvent(0, 0);
	return 0;
}


Исходный код плагина, к сожалению, показать не могу, но он (плагин) входит в состав SDK для платы MSTN-M100.
Предупреждаю — эта кнопка идет вместе с другим функционалом проекта, будьте осторожны :).

Если найдется человек, который сможет «перевесить» данный функционал на «родную» кнопку останова и выложит это в стандартный репозиторий NetBeans, думаю многие люди скажут ему спасибо, т.к. во многом только эта проблема останавливает людей от отказа от Eclipse в пользу NetBeans.
Бинго!
Из консоли работает, сейчас смотрю как внедрить в стандартную установку с минимальным вмешательством
похоже, получилось.
попробуйте скомпилировать свою утилиту, переименовать в GdbKillProc.exe и подложить в
%User%/AppData/Roaming/NetBeans/8.2/bin

кстати, у самописных кнопок и консольной остановки есть фундаментальный недостаток — не позволяют ставить брейкпоинты на лету, т.к. для этого требуется кратковременная остановка стандартным способом
У меня на win10 GdbKillProc из \NetBeans 8.2\cnd\bin\
С костылём, всё работает, но нужно ещё разобраться с параметрами которые NetBeans передаёт в GdbKillProc.exe
NetBeans использует параметры, как для простого kill -s INT , но, по крайней мере у меня, не передаёт не корректный PID процесса
да-да.
почему должен быть некорректный?
это как раз просто:
if (exEnv.isLocal() && Utilities.isWindows()) {
            File f = InstalledFileLocator.getDefault().locate("bin/GdbKillProc.exe", "org.netbeans.modules.cnd.debugger.common2", false); // NOI18N
            //bz#258406 - NullPointerException at org.netbeans.modules.cnd.debugger.common2.utils.ExecutorCND.interrupt
            //looks loke GdbKillProc file could not be located, will just check for null
            if (f != null && f.exists()) {
                ProcessUtils.execute(exEnv, f.getAbsolutePath(), "-s", "INT", Long.toString(pid)); //NOI18N
            }

(комменты авторские как есть)

т.е. GdbKillProc.exe -s INT [pid]

кстати только сейчас понял, что утилита требует правки для использования argv[3] для получения [pid]. забыл пояснить, извиняюсь

скоро обновлю пост, и будет наверное еще пара вопросов по автоматизации запуска OOCD/GDB, что вы выше писали
Да, только в моём случае NB передаёт в GdbKillProc несуществующий pid, судя по исходникам это pid запущенного под отладкой процесса, а не процесса gdb
NetBeans парсит ответ от gdb, gdb получает «магическое» значение pid от OpenOCD.
Этот pid и получает GdbKillProc.
Да, и похоже без модуля для NB не обойтись
С костылём, всё работает

а что тогда работает?
Модифицированный GdbKillProc, который сам ищет среди процессов gdb.
Но это плохой вариант, т.к. сессий отладки может быть несколько.
using namespace std;

#include <cstdlib>
#include <windows.h>
#include <Tlhelp32.h>

#define STR_EQUAL 0

void signINT(int consolePid) {
    FreeConsole();
    AttachConsole(consolePid);
    GenerateConsoleCtrlEvent(0, 0);
}

void onProcess(LPPROCESSENTRY32W proc) {
    if (lstrcmpiW(L"gdb.exe", proc->szExeFile) == STR_EQUAL || lstrcmpiW(L"arm-none-eabi-gdb.exe", proc->szExeFile) == STR_EQUAL) {
        signINT(proc->th32ProcessID);
    }
}

int main(int Argc, char** Argv) {
    //kill -s INT <PID>
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snapshot == INVALID_HANDLE_VALUE) {
        return 1;
    }
    PROCESSENTRY32W proc;
    proc.dwSize = sizeof (PROCESSENTRY32W);
    if (Process32FirstW(snapshot, &proc)) {
        onProcess(&proc);
        while (Process32NextW(snapshot, &proc)) {
            onProcess(&proc);
        }
    }

    CloseHandle(snapshot);
   return 0;
}
OK.
а если написать внешнюю обертку для GDB, которая будет запускаться из NetBeans, стартовать его самого и OOCD (условно-параллельно), возвращая правильный PID самого GDB, и просто форвардить управляющий траффик?
Думаю лучше делать плагин к NB.
В качестве костыля решение выше работает, просто оно «поставит на паузу» все сессии отладки через gdb.
в долгосрочной перспективе — да. только это другой уровень сложности, плюс зависимость от NB API, интеграционное тестирование, публикация, поддержка, обновления,…

кстати, ставить всех на паузу может оказаться полезной ф-цией при отладке многоголовых систем или обмена с ПК
Чтобы избежать этих проблем я использую Keil uVision, раньше IAR использовал, там можно было выбрать скромную легальную лицензию (на месяц или с ограничением по коду).
А зачем это делать на винде? Я такую же связку, правда в Eclipse сделал на Linux Mint.
чем тогда SW4STM32 не устраивает?
как раз Eclipse, сборка под Linux есть
Потому что микроконтроллер не стмовский.
Atollic TrueStudio не смотрели? Бесплатная для STM32, под винду ставится и работает вроде без танцев с бубнами.
со своим компилятором, с поддержкой от STM и без танцев с бубнами при установке под виндой
Sign up to leave a comment.

Articles