Comments 40
Пункт "Что не так в Eclipse / SW4STM32" меня очень удивил. Использую Эклипс для разработки под STM32 (CubeMX), Avr и прочий веб. Для каждого типа проекта имеется Custom Perspective, т.е. при работе с STM32 нету тулбаров от Avr и т.п. "полной пересборки (Clean and Build) как единой команды нет" называется Rebuild Project.
Но не без стакана дёгтя, разумеется, но он в обзор не вошёл...
кстати в NB спец-окна и тулбары активируются при помощи плагинов, при этом основная раскладка остается прозрачной между всеми режимами.
Rebuild Project после вашей подсказки нашел, в горячих клавишах (которые тоже почему-то настраиваются в свойствах окон (Windows->Preferences), как и все остальные системные настройки). в меню Project, как и в контекстном меню проекта, этого пункта нет. ну ОК, забиндил на Ctrl+F10 как у себя в NB/MPLabX. в фокусе редактора вместо пересборки открывается контекстное меню, в фокусе панели проектов — активируется верхнее меню. с контекстным оказывается — конфликт горячей комбинации, о чем Eclipse вежливо умолчал. устраняю. теперь верхнее меню активируется всегда, по Ctrl+F10. пересборка так и не работает. все, спасибо.
с этим сталкиваешься в первые полчаса использования среды. копать глубже уже как-то и смысла по-моему нет
"Как включить тулбар.." ниразу не сталкивался, хотя вопрос довольно старый…
Ну и за первые полчаса можно включить, например, готовый набор горячих клавиш, в комплекте есть Visual Studio и что-то там еще, кажется, Emacs :). Ну и полнотекстовый поиск по горячим клавишам имеется. Сейчас проверил кейс с Ctrl-F10, результат:
- Linux — работатет как заказано.
- Windows — активируется меню. По Ctrl-F10 у меня во всех приложениях активируется меню… хмммм...
Вывод: Windows must чего-то там. Не агитирую за советскую власть, но любая среда требует настройки, и не по полчаса, а как бы в процессе работы. В своё время я "ниасилил" настройку NetBeans от слова совсем, примерно вот как вы сейчас неделю обсуждаете как пропатчить gdb под netbeans, так и я провозился с какой-то ерундой, которая очень мне мешала комфортно работать. Долботня она везде, но у каждого своя.
Вы не пробовали посмотреть, как устроен в этом месте https://gnu-mcu-eclipse.github.io/?
Тот же набор в виде OpenOCD (или Segger JLink, по желанию) + GDB, и всё "само" работает.
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 умеет генерировать
Для перезапуска reset (halt/run/init)
сложность была в том, чтобы управлять из-под NetBeans
При этом не нужно вручную запускать openocd и делать Attach
target remote | openocd -c "gdb_port pipe; log_output openocd.log"
GDB and OpenOCD
#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
кстати, у самописных кнопок и консольной остановки есть фундаментальный недостаток — не позволяют ставить брейкпоинты на лету, т.к. для этого требуется кратковременная остановка стандартным способом
С костылём, всё работает, но нужно ещё разобраться с параметрами которые NetBeans передаёт в GdbKillProc.exe
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, что вы выше писали
Этот pid и получает GdbKillProc.
С костылём, всё работает
а что тогда работает?
Но это плохой вариант, т.к. сессий отладки может быть несколько.
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;
}
а если написать внешнюю обертку для GDB, которая будет запускаться из NetBeans, стартовать его самого и OOCD (условно-параллельно), возвращая правильный PID самого GDB, и просто форвардить управляющий траффик?
В качестве костыля решение выше работает, просто оно «поставит на паузу» все сессии отладки через gdb.
STM32 + NetBeans =?