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

razrab83

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

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

  • Посещение

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

    3

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


  1. В помощь ТС - ссылка Там изобилуют такими сообщениями, как... "Мы - профессионалы своего дела", "Начальная стоимость разработки от 71 000 руб.", "Почему выбирают нас? ..бла бла бла... при этом наш уровень цен на 10-15% ниже среднерыночных"
  2. 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 с инета вывалились другие тулченый, которые можно исталировать.
  3. В сматфонах/ноутбуках иногда стоит индикатор уведомлений - такая маленькая цветная точка. Что за светодиод используется? Там вроде не простой rgb smd0805, там какой-то яркий светодиод с линзой размером меньше 1мм.
  4. 1) не правильная. используйте события. 2) сп п.1, вопрос 2 решается в событиях. ps 3) вы заходите в первый if, вызываете xSemaphoreTake(). Этот метод никогда (с аргументом portMAX_DELAY) вам не вернет что-то отличное от pdPASS. xSemaphoreTake() блокирует выполнение задачи до получения семафора. Из прерывания отпускается семафор UP, задача разблокируется и вы зажигаете светодиод на ПИН_9. Что будет дальше? Что вы ожидаете от своего кода? Дальше заного начинает выполняться код в главном цикле, т.е. for(;;). Вы опять попадаете в ПЕРВЫЙ if. Опять блокируетесь бесконечно долго на на xSemaphoreTake() в ожидании нажатя кнопки "вверх". При нажатии "вверх" вы опять зажигаете светодиод на ПИН_9. Как вы хотели попасть во второй if? Ваш код ни когда не попадет во второй if.
  5. 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); } Валится?
  6. Некий неадекватный персонаж jcxz неоднократно пишет оскорбления, переходит на личности в "Cистемный уровень проектирования\Операционные системы\Программирование". Почему ему всё сходит с рук??? За гораздо меньшее других переводили в RO, ну или по-крайней мере удаляли посты. jcxz предлагает явно не рабочие решения (противоречащие стандарту языка программирования), и продолжает врать, что у него это работает. При этом постоянно переходит на оскорбления, нарушая пункт 2.1 правил форума. Подавал жалобу уже не раз на него - и нет никакой реакции. В "Cистемный уровень проектирования\Операционные системы\Программирование" вообще есть модератор?
  7. Да, в плюсах const int array[] объявленный 2 раза в разных исходниках собирается, без const нет. В си с const - нет.
  8. Нарушено правило ODR. Я же разжевал в чем косяк? См мой пост выше. Или вы издеваетесь? Модератор, дайте бан jcxz на пару недель, за издевательство. Может знание по С/С++ подтянет. Вы хотите сказать, что если вы в двух исходных файлах определите две глобальные переменные с одинаковым именем, то ваш линкер это проглотит? Если да, то вы не на с/с++ пишите. Вам тут не место на другой форум. Ну во первых у меня нет подобной проблемы, т.к. я подобный говнокод не генерирую. Во вторых, если кто и "оступиться", то компилятор линкер сообщит проблему и она легко правиться, и ни нужно ни куда ни чего писать. ну и в третих.... встречаются начинающие программисты, которые не могут справиться с Li006, они пишут об этом, просят помощь, даже на электрониксе. Поищите. ps собрал холоворд на gcc с вашим кодом - тоже самое, даже код ошибки такой же. Уже не требуется. Сделал именно через указатель. Всё равно спасибо!
  9. А вы не видите какой косяк в этом коде, не компилируя его? "дупликэйт дифинишин" - извините за мой французкий duplicate definition. Какая взаимосвязь между "множественным определением" и "множественным включением"? Естественно во всех хидерах есть #ifndef ASD_H. И? В приличных домах обычно, переменные объявляют в хидерах, определяют в исходниках. Включите #include "asd.h" в несколько *.с, компилятор в каждом *.с определит array (мне это зачем?), линкер дает законную ошибку дупликэйт дифинишин Error[Li006]: duplicate definitions for "array"; ps Научитесь держать слово за себя. Все другие сами за себя скажут.
  10. что не понятного? вот ваш пример 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 Смысл вытаскивать размер массива с помощью константной переменной, если нужно константое значение?
  11. нашел ключ Wmissing-field-initializers, скормил его иару, Command line error: Unexpected command line arguments: --Wmissing-field-initializers эх....
  12. не один вариант не работает. смотрите в чем проблема - #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 - не придумал. Может ключ какой подсунуть компилятору, чтобы он хотя бы ворнинг дал?
  13. Вообще, есть такой код (упрощённо) 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 } Есть решение для си, которое определило бы размер массива на этапе компиляции, определённого в другом файле? Может макросами/дефайнами как-то хитро сделать?
  14. Обнародованное решение с++. Для си есть решение?
  15. разобрался. в шаблон нельзя передавать не константу, которую нельзя вычислить на этапе компиляции. можно тему удалить.
  16. код 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); } невзлетело. вроде как в аргументы шаблона можно передать пользовательский тип. Что не так?
  17. я ни где в коде не увидел (не писал) 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 не нужно.
  18. Да! При этом, скорость "скролинга" не будет зависить от размера строкового буфера. Хоть буфер на 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)
  19. Зачем вообще что-то копировать и перемещать? Скролинг делается "скролингом" индекса. Я не знаю как у вас меняется индекс (кол-во) принятых строк 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 всегда будет указывать на последнюю принятую строку. не нужно ни каких адски сдвигов массивов с текстом, не будет ни какой нагрузки на МК.
  20. да так-то ку. можно сделать так "array[ i]" - тоже ку. Это всё костыли. Можно текст в ворде написать, вырезать ножницами скрин и сюда вставить картинку. Но интересно не как на этом форуме показать "[ i]", а как сказать вьюверу/редактору, что ЭТО НЕ УПРАВЛЯЮЩИЙ ТАГ наклонного текста? Как это делается правильно? Как, авторы этой разметки предусмотрели вывод текста "[ i]"? Через подобные костыли? Язык с++ тоже самостоятельно не занимается управлением динамической памятью. Этим занимаются всякие аля-контейнеры, например std::string/vector/.... Но контейнеры можно и на СИ организовать.
  21. что значит "блок кода"? Это то что раньше было обрамлено в [с0de] [\c0de]? Так такой блок кода будет в рамке, с подсветкой, с подсветкой индекса. У меня это не код с/с++, у меня это текст.... поспрашивал веберов - те накидали подобных костылей. Например, в си/с++, строка пишется в обрамлении кавычек "это строка 123", но если текст строки должен включать кавычку, есть управляющие символы "это строка \"123\"", где '\' - это управляющий символ. В этом редакторе WysiBB (или другое, поправте), [и] - это управляющи таг. Но должны же быть какие-то способы, чтобы редактору сказать - "этот текст не воспринимай как таг, а просто как текст". Веберы такого не знают. Кто знает как редактору сказать что "[и]" - это текст?
  22. Это массив из десяти строк. const char *str[] = {"message 1", "message 2", "message 3"}; - это массив сообщений... или массив строк. Понятно, что char *str[] - это массив указателей, Hо на практике такой массив называют "массив строк" и это подразумевает, что каждый эл-нт массива есть указатель на char и в 32-х битной архит-ре каждый эл-нт занимает 4 байта и каждый элемент указывает на строку. Двумя словами - массив строк. 1) "5" - строковая константа константная строка. Никогда не пишите код char *str = "5"; По мойму, на это компилятор должен выдать ворнинг. Если инициализируете строкой указатель, то всегда пишите const char *str = "5"; Избежите много ошибок на этапе компиляции. 2) Даже, если массив строк в озу, то у вас длинна каждой строки в в массиве строк strings_buffer два байта. 4-ая строка состоит из символа '5' и символа '\0'. Если индекс массива равен 4, т0 вы копируете 4 байта (судя по коду). Вы первый раз в цикле for записали в *strings_buffer[4] = rx_buffer[0]. Хорошо. Перетерли символ '5'. *strings_buffer[4]++ - теперь этот указатель указывает на следующий символ, на символ '\0'. Второй раз *strings_buffer[4] = rx_buffer[1]. Перетёрли символ '\0'. Строка "5" кончилась. Больше выделенной памяти для строки strings_buffer[4] нет. Ещё инкримент *strings_buffer[4]++ - теперь этот указатель указывает за пределы строки "5". Далее, при попытки записать в *strings_buffer[4] = rx_buffer[j] будет неопределённое поведение. HF - получите и распишитесь. 3)Где, после копирования, сброс указателя strings_buffer[4] на начало строки "5"? 4)Как вы скопируете массив байт в строку strings_buffer[0] таким кодом? Ведь для этого str_buffer_write_position должен быть равен 0, но тогда вы не разу не зайдете в тело for. 5)for (uint8_t i=0;i<rx_write_buffer_position;i++) *strings_buffer[str_buffer_write_position]++=rx_buffer; Это что за дичь? Что такое str_buffer_write_position? Может вам всетаки нужен не массив строк, а строка (или массив символов)? char strings_buffer[10]={'1','2','3','4','5','6','7','8','9','0'};//строка "1234567890" в ОЗУ, размером в 10 байт/символов, без символа "конец строки" ('\0') for (uint8_t i=0;i<rx_write_buffer_position;i++) if(i < 10) //защита от выхода за границы строки strings_buffer strings_buffer[i]=rx_buffer[i]; ps не путайте одинарные кавычки и двойные. pps К моератору..... что сделали с редактором? Раньше, выделил текст, нажал "I" - в начале и в конче текста в окне редактора появились символы [_i_] [\_i_] - текст в окне редатора не наклонный, видны таги. После публикации таги не видны, текст наклонный. Сейчас в редакторе таги не видны, сразу наклон. По мне, так менее удобно, раньше было лучше. Но да бохсним... Это ИМХО ни кого не интересуещее.... но сейчас выделил несколько слов в середине текста, нажал I, - в окне редактора наклонились нужные слова. Опубликовал - наклонился ВЕСЬ текст после этого слова. Раз 5 уже переправлял сообщение из-за этого глюка. ppps я понял в чем глюк. я хочу написать текст rx_buffer[тут "и" с точкой]. Т.е. если написать "эр Икс буффер итое, то индекс массива редактор воспринимает как открывающий таг наклонного текста. Мне кажется это косяк редактора, Как набрать текст "rx_buffer[j]", только вместо 'j' должна быть 'i'?
  23. по рукой АД нет. Онлайн_вьювер_степ показал. Модель вроде годная. СПАСИБО!!!!!
  24. оно. Сможет кто-нибудь конвертнуть? ps c 3dcontentcentral не качается степка, только sw2020. Может у кого получиться с 3dcontentcentral сдёрнуть степку?
×
×
  • Создать...