Перейти к содержанию
    

razrab83

Участник
  • Постов

    362
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Весь контент razrab83


  1. STM32CubeIDE

    Tor Browser дает скачивать. Vpn наверно то же.
  2. разница в том, что если явно написано "2+2" - это "2+2". Это явная запись "2+2", а не запись "Съешь ещё этих французских булочек". Хотя, при желании "+" можно перегрузить, и это будет что угодно. Привет индусскому коду, аля typedef true false а если написано "a | b ^ c & s" - тут неявная расстановка приоритетов, требующая помнить все 17 уровней. В неявных "операциях", гораздо чаще стрельнуть в ногу (отсыл к неявным приведениям типа, которые в с++ не приветствуются). Такой код "(a | (b ^ (c & s)))" даст такой же результат, но тут явно видно приоритеты. Даже если программист забыл, что "&" выше, чем "^", ни чего страшного, со скобками - ни автор, ни читающий не запутаются. не нужно мне приписывать что-то от себя. я этого не предлагал. ps а ещё в шк и вузе, пишут писали z = (a + b) + (x + y). Математически это тоже самое, что и без скобок, но понятнее из чего складывается z, ровно как и понятнее из чего складывается такой if if(((a - b) < 10) || ((b & 0xF) >= (a - 1)))
  3. не нужно путать тёплое с мягким. тут явный оператор "+=". if(a - b < 10 || b & 0xF >= a - 1) - тут неявная "расстановка" приоритетов.
  4. ППКС. в шк всего 2 приоритета. в си около 17. Все знают что в си у Операторы "&","|" и "^" разный приоритет?: Не заглядывая в справочник расставите приоритеты между ними? Ну во первых действительно, нужно однозначно понимать, что автор делает: он ошибся в приоритете, или он так и хотел сделать? Во вторых, зачастую код мигрирует из языка в язык. В одном языке у операций один приоритет, в другом другой. Я всегда расставляю приоритеты сам, вручную, скобками. Мне читать такой код понятнее. 1. тип int. рассчитываем управление вентиляции по некой формуле, причем, если на улице светло, то добавляем константу #define ASD 314 p = a*b + c*g + ASD * (getLighting() > lightingThreshold); или собираем регистр статуса. в 0-ом бите нужно выставить бит в 1, если температура выше 40 statusReg = a | (temperature > 40);
  5. В помощь ТС - ссылка Там изобилуют такими сообщениями, как... "Мы - профессионалы своего дела", "Начальная стоимость разработки от 71 000 руб.", "Почему выбирают нас? ..бла бла бла... при этом наш уровень цен на 10-15% ниже среднерыночных"
  6. STM32CubeIDE

    7-ка - это в какой версии идэ? у меня не самая свежая по дуфолту стоит gcc 9.3.1 Если нужен другой, так добавь его как в обычном eclipse скачивай/устанавливай/собирай сам - свой любимый компилятор toolchain далее Project->Properties->C++/Build->Settings->Tool Settings->MPU Toolchain->Open toolchain manager... В открывшемся окне Add Local. Дальше добавляй 10.3 предлагаемую на developer.arm.com любой тулчейн. ps Пока писал, в Open toolchain manager с инета вывалились другие тулченый, которые можно исталировать.
  7. В сматфонах/ноутбуках иногда стоит индикатор уведомлений - такая маленькая цветная точка. Что за светодиод используется? Там вроде не простой rgb smd0805, там какой-то яркий светодиод с линзой размером меньше 1мм.
  8. 1) не правильная. используйте события. 2) сп п.1, вопрос 2 решается в событиях. ps 3) вы заходите в первый if, вызываете xSemaphoreTake(). Этот метод никогда (с аргументом portMAX_DELAY) вам не вернет что-то отличное от pdPASS. xSemaphoreTake() блокирует выполнение задачи до получения семафора. Из прерывания отпускается семафор UP, задача разблокируется и вы зажигаете светодиод на ПИН_9. Что будет дальше? Что вы ожидаете от своего кода? Дальше заного начинает выполняться код в главном цикле, т.е. for(;;). Вы опять попадаете в ПЕРВЫЙ if. Опять блокируетесь бесконечно долго на на xSemaphoreTake() в ожидании нажатя кнопки "вверх". При нажатии "вверх" вы опять зажигаете светодиод на ПИН_9. Как вы хотели попасть во второй if? Ваш код ни когда не попадет во второй if.
  9. 1)вставь в log_printf слып void log_printf(const char *tag, const char *msg, ...) { xSemaphoreTake(log_mtx, portMAX_DELAY); va_list list; /* Got time and str time &date */ rtc_get_str_time(str_arr); xputs(str_arr); xputs(tag); /* Copy tag */ xputs(": "); va_start(list, msg); xvfprintf(uart_putc, msg, list); va_end(list); vTaskDelay(1000); //синтаксис не помню, см RM xSemaphoreGive(log_mtx); } запусти 20 10 таких задач void StartHearbeatTask(void const * argument) { static const char *tag = "Hearbeat"; log_printf(tag,"START\r\n"); for(;;) vTaskSleep(100); //Heatbeat_task(); } ОС валится? Если нет, то хитбит в студию Или может при запуске >10 задач стек переполняется? Метод vApplicationStackOverflowHook() определён? В него попадаешь? ps 2) задачу оставь со слыпом как в 1), а лог такой void log_printf(const char *tag, const char *msg, ...) { xSemaphoreTake(log_mtx, portMAX_DELAY); for(int i = 0; i< 500; i++) //печатаем что-то долгое, с чего валится ОС { va_list list; /* Got time and str time &date */ rtc_get_str_time(str_arr); xputs(str_arr); xputs(tag); /* Copy tag */ xputs(": "); va_start(list, msg); xvfprintf(uart_putc, msg, list); va_end(list); } xSemaphoreGive(log_mtx); } Валится?
  10. Некий неадекватный персонаж jcxz неоднократно пишет оскорбления, переходит на личности в "Cистемный уровень проектирования\Операционные системы\Программирование". Почему ему всё сходит с рук??? За гораздо меньшее других переводили в RO, ну или по-крайней мере удаляли посты. jcxz предлагает явно не рабочие решения (противоречащие стандарту языка программирования), и продолжает врать, что у него это работает. При этом постоянно переходит на оскорбления, нарушая пункт 2.1 правил форума. Подавал жалобу уже не раз на него - и нет никакой реакции. В "Cистемный уровень проектирования\Операционные системы\Программирование" вообще есть модератор?
  11. Да, в плюсах const int array[] объявленный 2 раза в разных исходниках собирается, без const нет. В си с const - нет.
  12. Нарушено правило ODR. Я же разжевал в чем косяк? См мой пост выше. Или вы издеваетесь? Модератор, дайте бан jcxz на пару недель, за издевательство. Может знание по С/С++ подтянет. Вы хотите сказать, что если вы в двух исходных файлах определите две глобальные переменные с одинаковым именем, то ваш линкер это проглотит? Если да, то вы не на с/с++ пишите. Вам тут не место на другой форум. Ну во первых у меня нет подобной проблемы, т.к. я подобный говнокод не генерирую. Во вторых, если кто и "оступиться", то компилятор линкер сообщит проблему и она легко правиться, и ни нужно ни куда ни чего писать. ну и в третих.... встречаются начинающие программисты, которые не могут справиться с Li006, они пишут об этом, просят помощь, даже на электрониксе. Поищите. ps собрал холоворд на gcc с вашим кодом - тоже самое, даже код ошибки такой же. Уже не требуется. Сделал именно через указатель. Всё равно спасибо!
  13. А вы не видите какой косяк в этом коде, не компилируя его? "дупликэйт дифинишин" - извините за мой французкий duplicate definition. Какая взаимосвязь между "множественным определением" и "множественным включением"? Естественно во всех хидерах есть #ifndef ASD_H. И? В приличных домах обычно, переменные объявляют в хидерах, определяют в исходниках. Включите #include "asd.h" в несколько *.с, компилятор в каждом *.с определит array (мне это зачем?), линкер дает законную ошибку дупликэйт дифинишин Error[Li006]: duplicate definitions for "array"; ps Научитесь держать слово за себя. Все другие сами за себя скажут.
  14. что не понятного? вот ваш пример asd.c: int array[] = {1,2,3}; const int array_size = sizeof(array)/sizeof(int); main.c: #include <stdio.h> extern int array[]; extern const int array_size; void main(){ printf("%d", array_size); } Это понятно? теперь посмотрите мой самый первый main.c. Мне нужно создать переменную вне тела маин и инициализировать её размером массива.Т.е ваш маин для меня должен быть таким #include <stdio.h> extern int array[]; extern const int array_size; int qwe = array_size; void main(){ //printf("%d", array_size); //в коде мне не нужно использовать array_size printf("%d", qwe); } Не компилируется. expression must have a constant value Смысл вытаскивать размер массива с помощью константной переменной, если нужно константое значение?
  15. нашел ключ Wmissing-field-initializers, скормил его иару, Command line error: Unexpected command line arguments: --Wmissing-field-initializers эх....
  16. не один вариант не работает. смотрите в чем проблема - #include asd.h int qwe = sizeof(array);//вот проблемная строчка void main(void) { //code } даже если сделать так #include asd.h const int a = 10; int qwe = a;//вот проблемная строчка void main(void) { //code } Компилятор дает ошибку "expression must have a constant value". Т.е. на этапе компиляции qwe нужно инициализировать константой. Не константной переменной, а константой. Как это сделать - хз. Хорошо.... если так си не умеет... можно препроцесор заставить проверить размер массива? пока сделаю так.... asd.c #include asd.h int array[SIZE_ASD] = {1,2}; asd.h #define SIZE_ASD 2 extern int array[SIZE_ASD]; main.c #include asd.h int qwe = SIZE_ASD; //или int qwe2 = sizeof(array) / sizeof(array[0]; void main(void) { //code } Этот вариант не нравиться, т.к. SIZE_ASD может быть равен 100, а тут "int array[SIZE_ASD] = {1,2,...};" в фигурных скобках будет 98 элементов. Два последних не инициализируются. Как прероцессор заставить на этапе компиляции проверить, что кол-во элементов при инициализации равно SIZE_ASD - не придумал. Может ключ какой подсунуть компилятору, чтобы он хотя бы ворнинг дал?
  17. Вообще, есть такой код (упрощённо) asd.c #include asd.h int array[2] = {1,2}; asd.h #include asd.h extern int array[2]; main.c #include asd.h int qwe = sizeof(array); void main(void) { //code } Работает. Но я не хочу явно указывать размер массива array. я хочу как-то так #include asd.h int array[] = {1,2}; asd.h #include asd.h extern int array[]; main.c #include asd.h int qwe = sizeof(array); void main(void) { //code } Не компилируется. Error[Pe070]: incomplete type is not allowed. Я понимаю, что на этапе компиляции main.c не известен размер array. Если сделать всё в майне, то работает main.c int array[] = {1,2}; int qwe = sizeof(array); void main(void) { //code } Есть решение для си, которое определило бы размер массива на этапе компиляции, определённого в другом файле? Может макросами/дефайнами как-то хитро сделать?
  18. Обнародованное решение с++. Для си есть решение?
  19. разобрался. в шаблон нельзя передавать не константу, которую нельзя вычислить на этапе компиляции. можно тему удалить.
  20. код typedef struct MySlideItem { int y; }MySlideItem; MySlideItem slide1, slide2, slide3, slide4; void removeF(MySlideItem *item ) { item->y = 23; } void f1(int a) { removeF(&slide1); } void f2(int a) { removeF(&slide1); } void f3(int a) { removeF(&slide1); } void f4(int a) { removeF(&slide1); } экземпляров структуры MySlideItem 100500. Соответственно однотипных функций типа f1(int) - также 100500. от акына простыней кода должен спасти шаблон. typedef struct MySlideItem { int y; }MySlideItem; MySlideItem slide1, slide2, slide3, slide4; void removeF(MySlideItem *item ) { item->y = 23; } template<MySlideItem BASE> void f1(int a) { removeF(&BASE); } int main() { f1<slide1>(0); } невзлетело. вроде как в аргументы шаблона можно передать пользовательский тип. Что не так?
  21. я ни где в коде не увидел (не писал) str_buffer_write_position = .... Переменная str_buffer_write_position измениться только после оператора "=". for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[str_buffer_write_position%100][i]=rx_buffer[i]; Тут str_buffer_write_position делится на 100, остаток от деления используется в качестве индекса массива, но сама переменная str_buffer_write_position не меняется. Если у вас где-то в коде str_buffer_write_position обнуляется, то тогда дополнительно в выводе %100 не нужно.
  22. Да! При этом, скорость "скролинга" не будет зависить от размера строкового буфера. Хоть буфер на 5 строк, хоть на 100 строк, хоть на 65000 строк. Вывод начиная с самой старой строки for(int i = 0; i<100; i++) { int j = i + str_buffer_write_position%100; if( j > 99) j -= 100; printf(&TERMINAL_TEXT[j][0]); } как-то так (только "100" заменть на define)
  23. Зачем вообще что-то копировать и перемещать? Скролинг делается "скролингом" индекса. Я не знаю как у вас меняется индекс (кол-во) принятых строк str_buffer_write_position. Допустим изменятеся от 0 до 10000000000000000000000000000000000. тогда #define RX_BUFFER_SIZE 256 uint8_t rx_buffer[RX_BUFFER_SIZE]; char TERMINAL_TEXT[100][256]; for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[str_buffer_write_position%100][i]=rx_buffer[i]; и ни чего, при появлении 101-ой строки ни куда не нужно перекопировать. последняя строка всегда str_buffer_write_position%100 можно, для читаемости кода так #define RX_BUFFER_SIZE 256 uint8_t rx_buffer[RX_BUFFER_SIZE]; char TERMINAL_TEXT[100][256]; static int index = 0; index = str_buffer_write_position%100; for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[index][i]=rx_buffer[i]; for(uint8_t i=0;i<255;i++) TERMINAL_TEXT[str_buffer_write_position][i]=rx_buffer[i]; У вас же не каконить ПК с говновиндой, у вас МК со всеми потрахами. Зачем какие-то memmove и т.п.? Используйте DMA. ps сделайте буфер размером степень 2, т.е. 128 или 64. Тогда #define RX_BUFFER_SIZE 256 uint8_t rx_buffer[RX_BUFFER_SIZE]; char TERMINAL_TEXT[128][256]; static int index = 0x7f; //при получении новой строки инкремент индекса ++index &= 0x7f; //или (128-1), или (64-1) //for(uint8_t i=0;i<255;i++) // TERMINAL_TEXT[index][i]=rx_buffer[i]; memcpy(&TERMINAL_TEXT[index][0], rx_buffer, 255); у вас index всегда будет указывать на последнюю принятую строку. не нужно ни каких адски сдвигов массивов с текстом, не будет ни какой нагрузки на МК.
  24. да так-то ку. можно сделать так "array[ i]" - тоже ку. Это всё костыли. Можно текст в ворде написать, вырезать ножницами скрин и сюда вставить картинку. Но интересно не как на этом форуме показать "[ i]", а как сказать вьюверу/редактору, что ЭТО НЕ УПРАВЛЯЮЩИЙ ТАГ наклонного текста? Как это делается правильно? Как, авторы этой разметки предусмотрели вывод текста "[ i]"? Через подобные костыли? Язык с++ тоже самостоятельно не занимается управлением динамической памятью. Этим занимаются всякие аля-контейнеры, например std::string/vector/.... Но контейнеры можно и на СИ организовать.
×
×
  • Создать...