-
Постов
10 921 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Сообщения, опубликованные Сергей Борщ
-
-
14 часов назад, aleksandr-zh сказал:
Удивлю: Вам не хватит
Модератор: Перечитал исходное сообщение темы дважды. Не увидел там вопроса об этом. При ответах учитывайте тематику этого раздела форума.
3 часа назад, ericN сказал:Вы бпла на дровах и паровом двигателе будете делать?
Модератор: А вы задаете уточняющие вопросы потому что вас заинтересовало предложение или просто проходя мимо набросить на вентилятор решили? Рекомендую ознакомиться с правилами этого раздела и соблюдать их. Правила раздела находятся тут:
На первый раз устное предупреждение.
-
Мой из v2.02. Может вам стоит обновить свой, мало ли что нового могли туда написать?
-
1
-
-
-
15 минут назад, vvppvv сказал:
Инструкция SWAP в ассемблерах мне встречалась часто, но вот чтобы её использовать в Си для AVR, приходится подключать и применять intrinsic-функции,
У меня конструкция
byte = (byte >> 4)|(byte << 4);
обычно оптимизировалась в swap. С включенной оптимизацией, разумеется (без оптимизации не компилирую).
-
3 часа назад, AlexBel сказал:
В процессе экспериментов специально делал "висячки" - потребляемый ток увеличивался
А нет ли у этого контроллера варианта с бОльшим количеством ног? Кристаллы в них обычно идут одинаковые и часть портов просто не подключаются к выводам корпуса, но их тоже нужно настраивать.
-
Не знаю ничего об AT32, но, например, у STM32WLE в режиме Standby регистры настройки портов не работают, там есть отдельные регистры PWR->PDCRx и PWR->PUCRx, которыми можно включить подтяжки к земле и питанию, а без подтяжек висящие в воздухе ноги вполне могут вызывать повышенное потребление. Кроме этого есть выводы, у которых подтяжки включены по-умолчанию и эти подтяжки могут конфликтовать с внешними сигналами (у меня, например, в рабочем режиме конфликтовала подтяжка NJTRST).
-
4 часа назад, Solonovatiy сказал:
Это же считай обертка под проект, просто четко проводящая границу между железом, хал если он есть - ниже.
Интересно, а как вы расшифроваете аббревиатуру "HAL"? Потому что весь остальной мир расшифровывает "HAL" как "Hardware abstraction layer", что буквально и означает "обертка, четко проводящая границу между железом и прикладным софтом". Или вы имели ввиду границу между железом и чем-то другим?
-
Ничего не понял. В общем случае глубина стека на момент вызова функции может быть любой и, соотвественно, любым может быть адрес переменной на стеке.
-
Потому что при первом вызове функции a() стек условно пустой, а при втором вызове на стеке уже лежит переменная ii из функции b(). Что вы понимаете под понятием "статика" - мне неведомо.
Ну погоняйте этот код под отладчиком до пониамния, что ли. Я пас.
-
1 минуту назад, jenya7 сказал:
что поменялось между входами?
Вы действительно не понимаете или издеваетесь?
void a() { int i; printf("addr = %p\n", &i); } void b() { volatile int ii = 0; a(); } void test() { a(); b(); }
-
1 час назад, jenya7 сказал:
расположаться
Что сделаютЬ?
1 час назад, jenya7 сказал:на стаке
А чего сразу не "на стацке"?
Надеюсь, вы понимаете, что в общем случае при каждом входе в функцию эти адреса будут разные?
Что-то мне подсказывает, что вы снова закатываете Солнце вручную и пытаетесь реализовать va_arg
-
4 минуты назад, tgruzd сказал:
Проблема, как я её вижу, переопределить malloc вызываемый неявно, например как здесь:
А разве там компилятор не вставляет вызов той же самой malloc()? Что говорит листинг?
-
1
-
-
4 часа назад, jenya7 сказал:
я опустил HEAP на ноль а проект компилируется
😂🤣😅
ЦитатаВиктор Михайлович уцелел чудом и из обломков мотоцикла в следующий запойный период устроил стационарный двигатель, который был очень похож на настоящий, но не работал.
-
1 час назад, tgruzd сказал:
Вот отсюда вопрос, как сделать так чтобы подобные неявные вызовы malloc перенаправлялись в pvPortMalloc, например?
Переопределить malloc() своей реализацией, которая вызывает ваш любимый менеджер кучи? В gcc работает:
extern "C" void * malloc(size_t size) { return Manager.malloc(size); } #include <string.h> extern "C" void * calloc(size_t count, size_t element_size) { void * Ptr = malloc(count * element_size); if(Ptr) memset(Ptr, 0, count * element_size); return Ptr; } extern std::nothrow_t const std::nothrow; void * operator new(size_t size, std::nothrow_t const &) { return Manager.malloc(size); } void * operator new[](size_t size, std::nothrow_t const &) { return Manager.malloc(size); } void * operator new(size_t size) { void * Ptr; while((Ptr = Manager.malloc(size))== nullptr) free_memory(); return Ptr; } void * operator new[](size_t size) { return operator new(size); } extern "C" void free(void * ptr) { Manager.free(ptr); } void operator delete(void * ptr) // delete allocated storage { free(ptr); } // absence of this implementation causes warning since C++14. // Called instead of operator delete(void *) if a user-defined replacement is provided, except that it's // unspecified whether operator delete(void *) or operator delete(void *, size_t) is called when deleting // objects of incomplete type and arrays of non-class and trivially-destructible class types. A memory allocator // can use the given size to be more efficient. The standard library implementations are identical to operator delete(void *) void operator delete(void * ptr, size_t) { free(ptr); } void operator delete[](void * ptr) // delete allocated storage { free(ptr); } // absence of this implementation causes warning since C++14. // Called instead of operator delete[](void *) if a user-defined replacement is provided, except that it's // unspecified whether operator delete[](void *) or operator delete[](void *, size_t) is called when deleting // objects of incomplete type and arrays of non-class and trivially-destructible class types. A memory allocator // can use the given size to be more efficient. The standard library implementations are identical // to operator delete[](void *) void operator delete[](void * ptr, size_t) { free(ptr); }
Простите, не нашел как сделать код сворачиваемым.
-
47 минут назад, haker_fox сказал:
Отладчик ST-Link тоже не работает. Нужен CMSIS-DAP.
Именно с 450 или со всеми GD32? Потому что с F10x в связке с openocd у меня почему-то работал. Может потому, что я не знал, что не должен?.
-
Да, склероз. Это Intel-hex, а исходник был s43. Про железо/софт тут писали, выбор по железу не особо богатый.
Если у вас в столе случайно нет такого железа, можно воспользоваться заводским загрузчиком через переходник на УАПП (UART)
Вот, нашел. Сделайте скидку на возраст статьи, ей больше 20 лет.
-
Это ассемблерный исходник для, кажется, IAR. Можете убедиться, открыв его в текстовом редакторе. Так что его надо сначала прогнать через ассемблер, но я за 20 лет забыл, как это делать правильно.
-
17 минут назад, jenya7 сказал:
интересно. но таблица векторов read only.
А вам эти данные еще и менять надо было? В исходной задаче об этом ни слова.
17 минут назад, jenya7 сказал:к тому же это таблица указателей на обработчики прерываний.
Обратите внимание на ее первый элемент. Что там? Неужто указатель на обработчик? Оставим пока за скобками авторов этих файлов, ниасиливших описать этот участок памяти в виде структуры из правильных типов.
-
В блоке питания имеется дополнительный постоянно включенный источник дежурного питания +5 В. Возможно, что конденсатор на его выходе высох и под нагрузкой он не в состояни обеспечить необходимое напряжение для работы дежурных цепей материнки.
-
34 минуты назад, vvppvv сказал:
Почему "почти"? См. свап ниблов. Откуда-то вылез R18, который после нигде не фигурирует.
Может быть стоило написать ctemp = __swap_nibbles(ctemp); ?
-
26 минут назад, vvppvv сказал:
Если есть цивилизованый способ как-то "обволятилить" R17, то подскажите?
ИАР всегда отличался неплохой документацией и эта документация всегда шла в комплекте. Там искали? На сайте IAR выложена документация от 2017 года, в которой английским по белому сказано: "никак".
Если с тех пор ничего не поменялось - переходите на GCC, там компилятору можно объяснить все и он даже сам может выбрать наиболее подходящие регистры:
asm volatile ( "LD %[tmp], %a[ptr]+ \n\t" "STS %B[OCR], %[tmp] \n\t" "LD %[tmp], %a[ptr]+ \n\t" "STS %A[OCR], %[tmp] \n\t" "LD %[tmp], %a[ptr]+ \n\t" "OUT %[port_b], %[tmp] \n\t" "LD %[tmp], %a[ptr]+ \n\t" "OUT %[port_c], %[tmp] \n\t" : [ptr]"+e"(pTmp), [tmp]"=r"(Tmp) : [OCR] "M" (_SFR_MEM_ADDR(OCR1A)) , [port_b] "I" (_SFR_IO_ADDR(PORTB)) , [port_c] "I" (_SFR_IO_ADDR(PORTC)) : );
.
-
В 05.12.2022 в 23:58, Сергей Борщ сказал:
Да, сток и исток попутал. А если их поменять местами, транзистор безусловно откроется при включении зарядника. Надо подумать еще...
Подумал. получилось так:
R1, R2 посчитаны для включения при напряжении на батарее больше 7 В. При меньшем напряжении заряжать ее смысла нет. VT2 должен иметь максимальное напряжение исток-затвор не менее -20 В, при -7 В он уже будет далеко не в линейном режиме.
-
К176ИЕ12да, 4060. -
7 минут назад, tgruzd сказал:
Вроде, у вас встроенный диод включен так же как и у автора
Да, сток и исток попутал. А если их поменять местами, транзистор безусловно откроется при включении зарядника. Надо подумать еще...
Home assistant
в Умный дом
Опубликовано · Пожаловаться
"Это для слабых!"