Я уже решил эту проблему. Поскольку я не знаю, как, и, похоже, нет прямого способа вернуть позицию бита, его можно вычислить, запросив несколько адресов GDB.
Использование команды p & может определять адрес переменной, но не ее бит-поля или его битовую позицию. С помощью команды печати GDB на структуры, расположение bitValue мне нужно, он будет возвращать все доступные значения этой структуры, например:
Ищу для битового: MachineToUi.tramlining.sensorBoutAdvance
MachineToUi будет возвращать следующие:
$1 = {speedPls = {present = 0 '\000', time = 0, count = 0, noPulseCount = 0,
value = 0, calDist = 0, calPulses = 0,END DATA ALL DATA: sampleTime = 0}, output = {
trackMarkerL = 0 '\000', trackMarkerR = 0 '\000',
workingLights = 0 '\000', foldingFrame = 0 '\000',
tramlineShutoffL1 = 0 '\000', tramlineShutoffR1 = 0 '\000'}, input = {
fanPpm = 0, workswitch1 = 0 '\000', workswitch2 = 0 '\000',
speedSensor = 0 '\000', fanSensor = 0 '\000', meteringEncL = 0 '\000',
motorEncL = 0 '\000', trackMarkerL = 0 '\000', trackMarkerR = 0 '\000',
lowLvlHopperL = 0 '\000', venturiFlapL = 0 '\000',
calButtonL = 0 '\000'}, hssoOutput = HSSO_IDLE, tramlining = {
active = 0 '\000', restoreCfg = 0 '\000', updateCfg = 0 '\000',
boutAdvance = 0 '\000', boutDecrement = 0 '\000',
noTramlineIncDec = 0 '\000', displaySfks = 0 '\000',
sensorBoutAdvance = 0 '\000', bout = 0 '\000'}, tramlineLeft = 0 '\000',
tramlineRight = 0 '\000', diagOutputs = '\000' <repeats 11 times>,
markerAutoDown = 0 '\000', fanRpm = 0, fanOffTime = 0, speed = 0,
fsAlarmSensorNr = 0 '\000', fsAlarmDisconnectedSensorNr = 0 '\000',
fsAlarmType = 0 '\000', seeding = 0 '\000', actMinSpeed = 0,
actMaxSpeed = 0, lastSensorBout = 0 '\000', ctrMLeftUpFlash = 0 '\000',
ctrMRightUpFlash = 0 '\000', folding = 0 '\000', startLeftOff = 0 '\000',
startRightOff = 0 '\000', halfSideShutOff = 0 '\000',
oldMarkerPosL = 0 '\000', oldMarkerPosR = 0 '\000',
timeDateActive = 0 '\000', licVtCheck = 0 '\000', trialVtCheck = 0 '\000',
trialAlarmActive = 0 '\000', workBeep = 0 '\000', warningBeep = 0 '\000',
errorBeep = 0 '\000', runLed = 0 '\000', tcLicenseOk = 0 '\000',
WDI_start = 0 '\000', newViewSeedCalRecRead = 0 '\000',
MotorStopMarkerDelay = 0}
Я заинтересован в переменной: sensorBoutAdvance.
Перечисляя все переменные вокруг sensorBoutAdvance в пределах диапазона, по крайней мере 8 до значения, которое необходимо прочитать и 1 за значение, которое вы хотите прочитать, и сделать GDB вернуть их адрес:
* calButtonL 0x2000435A
* hssoOutput 0x2000435B
* tramlining 0x2000435C
* restoreCfg 0x2000435D
* updateCfg 0x2000435E
* boutAdvance 0x2000435F (Same address! Stop search!)
* boutDecrement
* noTramlineIncDec
* displaySfks
* sensorBoutAdvance (Known address by &p = 0x2000435F)
* bout
* tramlineLeft
* tramlineRight
* diagOutputs
* markerAutoDown
* fanRpm
* fanOffTime
* speed
* fsAlarmSensorNr
* fsAlarmDisconnectedSensorNr
Как как только тот же адрес будет найден, обнаружен битField. И в этом случае sensorBoutAdvance можно найти на бит 5.Если двойной адрес не найден, это может быть не битField, но по крайней мере бит-позиция не имеет значения. Если тот же адрес найден сразу после вашей переменной, которую вы хотите прочитать (а не раньше), ваша позиция бита находится на первом бите.
Он обязательно требует некоторого разбора, но работает для меня без необходимости добавлять внешние программы или разные языки.
Примечание: Этот метод будет работать только тогда, когда все битовые поля имеют только 1 бит.
Фактический базовый тип зависит от 'bool_t', что это такое? И нет, нет никакого способа получить битную позицию. О, и если каждый бит был целым 'uint8_t', то каждый бит определенно имел бы свои собственные адреса, а не делился, как сейчас. –
bool_t - это символ без знака. И, да, это довольно очевидно, дело в том, что я должен знать это, используя только одну переменную, не используя их всех и проверяя удвоения. – koldewb
Спецификация языка C гарантирует, что установка бит в битовое поле будет только установите этот бит. Точно так же, как компилятор реализует его, не имеет значения, но использование фактических битов в более крупном типе, я думаю, довольно распространено (и, похоже, это ваша реализация компиляторов, учитывая, что два бита используют один и тот же адрес, поскольку они являются одиночными битами в более крупный тип). И чтобы ответить на ваш вопрос, то, что вы хотите, невозможно, поддержки нет. Вы можете верить, что если у вас бит в битовом поле, он будет обработан правильно. –