-
- если таймер0 не используется в системе и tasks[0].timer не
проинициализирован, то сразу же будет выходить с NULL на выходе Oman(107 знак., 06.07.2025 10:33)
- Причем тут таймер0? - POV(06.07.2025 17:51)
- Поставь continue вместо первого return NULL и проверь, прав ли я. В
чем сложность? Oman(61 знак., 06.07.2025 19:19)
- ну вот... POV(182 знак., 06.07.2025 20:19, картинка, картинка)
- может после проверки if(!t) ничего по этому указателю в обработчике
больше не делается? - Vit(06.07.2025 21:35)
- "при статик работает".. значит - делается - POV(06.07.2025 21:38)
- получается массив пакованных структур - Vit(06.07.2025 21:46)
- не, всё там норм. никакой упаковки POV(1 знак., 06.07.2025 21:49, картинка)
- Коль структура так упорно применяется без выравнивания, то может
стоит попробовать временно вместо uint8_t num применить int num? - reZident(06.07.2025 23:03)
- мне тоже uint8_t по середине структуры не нравится, либо ее в
uint32_t либо в самый конец структуры. - Oman(07.07.2025 10:25)
- Я бы тоже постеснялся бы куда-попало совать uint8_t. Но у ТС проблема вылазит на нулевом элементе массива. Выравнивать массив уже предлагалось, но... - Vit(07.07.2025 11:15)
- робот говорит, что выравнивается POV(1 знак., 07.07.2025 10:53, картинка)
- Стопе! Это вообще не в ту степь! Проблема не в данных, а в
вовзращаемом указателе. Пофиг что в массиве хранится. - POV(06.07.2025 23:05)
- Покажите уже ассемблер, выдаваемый компилятором, особенно начало
TMR2_GLOBAL_IRQHandler, так будет понятнее - AlexBi(07.07.2025 08:44)
- Роботу скормил ассемблер. Возвращаются данные через r0, и вроде всё
верно. Но есть у робота подозрение что компилятор косячнул -
неверно смещения по элементами массива считает, хотя сам же
выравнивание и добавил. - POV(07.07.2025 11:02)
- Смотри, ты так последние мозги растеряешь - как робот скажет, так и сделаешь. Без успеха... - Nikolay_Po(07.07.2025 11:10)
- Это тот же робот, который вырезал аппендикс не с той стороны? :-) SciFi(1 знак., 07.07.2025 11:08, картинка)
- Роботу скормил ассемблер. Возвращаются данные через r0, и вроде всё
верно. Но есть у робота подозрение что компилятор косячнул -
неверно смещения по элементами массива считает, хотя сам же
выравнивание и добавил. - POV(07.07.2025 11:02)
- Кстати, меня несколько напрягают умолчания в if, где логическая операция отрицания (!) применяется к переменной, имеющей тип указателя. Я не настолько знаю язык, чтобы спрогнозировать, а не заменит ли
компилятор обращение к переменной указателя со значением NULL на
обращение к какой-то "левой" переменной, имеющей такое же значение
NULL? Вам ведь уже предлагали расписать эту операцию явным образом,
без умолчаний по автоматическому преобразованию типов данных. - reZident(06.07.2025 23:48)
- это нормально для всех вариантов СИ с мохнатых годов - POV(07.07.2025 00:04)
- "Блажен кто верует". Проверить-то ведь не долго. - reZident(07.07.2025 00:07)
- десятки проектов говорят, что "норм" - POV(07.07.2025 00:12)
- "Блажен кто верует". Проверить-то ведь не долго. - reZident(07.07.2025 00:07)
- это нормально для всех вариантов СИ с мохнатых годов - POV(07.07.2025 00:04)
- Доступ к элеентам разной размерности в невыровненной структуре может приносить чудные чудеса. Например, запись в байтовую num при нативной 32-разрядной системе портить 2-3 байта соседних элементов-указателей. - reZident(06.07.2025 23:11)
- для начала можно в map-файле поискать адрес массива для каждого случая - Vit(06.07.2025 23:11)
- Покажите уже ассемблер, выдаваемый компилятором, особенно начало
TMR2_GLOBAL_IRQHandler, так будет понятнее - AlexBi(07.07.2025 08:44)
- мне тоже uint8_t по середине структуры не нравится, либо ее в
uint32_t либо в самый конец структуры. - Oman(07.07.2025 10:25)
- а можно в занулении массива поставить просто нолик? - Vit(06.07.2025 22:00)
- Блин, пошагово всё идет как надо. Всего один элемент tasks
инилизирован. Указатель на него и возвращется. - POV(06.07.2025 22:11)
- Включи LTO и смотри предупреждения. Обычно, включение макс. оптимизации, даёт подсказки в виде предупреждений компилятора. - Nikolay_Po(07.07.2025 08:17)
- где-то ненулевое значение в поле timer заносится? из варианта с
continue получается, что таки заносится (иначе был бы переход на
проверку условия в for). не догоняю по этой логике нафига поле
num... но если по-шагово видно, то стОит после точки останова ещё
шажок сделать. можно и барьер __DSB() перед if влупить - Vit(06.07.2025 22:33)
- static решает? значит намудрил компилятор, я не вижу иного... POV(67 знак., 06.07.2025 22:36)
- Блин, пошагово всё идет как надо. Всего один элемент tasks
инилизирован. Указатель на него и возвращется. - POV(06.07.2025 22:11)
- Коль структура так упорно применяется без выравнивания, то может
стоит попробовать временно вместо uint8_t num применить int num? - reZident(06.07.2025 23:03)
- не, всё там норм. никакой упаковки POV(1 знак., 06.07.2025 21:49, картинка)
- получается массив пакованных структур - Vit(06.07.2025 21:46)
- "при статик работает".. значит - делается - POV(06.07.2025 21:38)
- может после проверки if(!t) ничего по этому указателю в обработчике
больше не делается? - Vit(06.07.2025 21:35)
- ну вот... POV(182 знак., 06.07.2025 20:19, картинка, картинка)
- Поставь continue вместо первого return NULL и проверь, прав ли я. В
чем сложность? Oman(61 знак., 06.07.2025 19:19)
- Причем тут таймер0? - POV(06.07.2025 17:51)
- Пойдем простым логическим путем, с отделением мух и котлет. il-2(568 знак., 06.07.2025 06:57)
- Мусор, т.к. локальная переменная расположилась на месте, где ранее было что-то иное. И только-то - POV(06.07.2025 17:52)
- С компьютерами логика не всегда работает. Tyмблep(500 знак., 06.07.2025 15:30)
- Еще бы знать, где этот tasks определен и зачем его искать в цикле
постоянно никнeйм(274 знак., 04.07.2025 16:13,
)
- Должно работать. Попробуйте: а) разделить объявление переменной timer_task_t *t и присвоение; б) убрать static из timer_task_t* get_tmr(uint8_t num) - 3m(04.07.2025 15:36)
- Возможно это тот случай, когда имеет смысл посмотреть ассемблер, т.е. что там компилятор сделал. В первую очередь посмотреть начало TMR2_GLOBAL_IRQHandler Можно его увидеть? - AlexBi(04.07.2025 08:26)
- похоже запись в tasks[i].timer только в этом же обработчике. а при нуле в на входе и делать нихрена не нужно - Vit(04.07.2025 00:55)
- Я понимаю, что NULL это по сути 0, но всё равно не нравится условие
if (!t). Лучше писать if (t != NULL). Также надо проверить размер
стека в стартапе, вдруг реально не хватает, тем более, что static
помогает. - FDA(03.07.2025 23:39)
- Может попасться двояко. Но сишнику это пофиг POV(1 знак., 03.07.2025 23:42, картинка)
- Стек проверил? - FDA(03.07.2025 23:42)
- Нет (как?), но он большой. Хватает на web-морду и много чего еще. А
вот тут через стек возвращается херь какая-то. - POV(03.07.2025 23:45)
- Можно так Tyмблep(407 знак., 04.07.2025 03:08)
- УARM/Cortex стек прерываний отдельный. - qwerty__(03.07.2025 23:51,
)
- Может быть отдельным. - ЫЫyкпy(04.07.2025 04:26)
- и? POV(1 знак., 03.07.2025 23:59, ссылка)
- Нет (как?), но он большой. Хватает на web-морду и много чего еще. А
вот тут через стек возвращается херь какая-то. - POV(03.07.2025 23:45)
- Стек проверил? - FDA(03.07.2025 23:42)
- Может попасться двояко. Но сишнику это пофиг POV(1 знак., 03.07.2025 23:42, картинка)
- Когда переменная объявлена static , то память под нее выделяется в
сегменте .data . qwerty__(132 знак., 03.07.2025 23:02,
)
- Я конечно не программист, но у меня вызвает сомнения вот такая
конструкция sizeof(tasks)/sizeof(tasks[0]) . Возможно результат
целочисленного деления равен нулю и поэтому функция всегда
возращает NULL. Компилятор просчитывает этот момент и не видит
необходимости вставлять вызов функции в обработчик прерывания. - reZident(03.07.2025 22:58)
- Эта конструкция похоже на Tyмблep(110 знак., 04.07.2025 03:17)
- Не, оно выходит строго на строке "return &tasks[i];" где i=0 и
всё ожидается как надо. Это через стек неверно возвращается
указатель... POV(136 знак., 03.07.2025 23:00)
- Вроде бы результат функции возвращается через регистр. А вообще надо по шагам проходить отладчиком по дизассемлеру - 3m(04.07.2025 15:39)
- А определение структуры task можно увидеть? При определении она имеет атрибуты выравнивания? - reZident(03.07.2025 23:03)
- если таймер0 не используется в системе и tasks[0].timer не
проинициализирован, то сразу же будет выходить с NULL на выходе Oman(107 знак., 06.07.2025 10:33)