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

maxntf

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

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

  • Посещение

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


  1. Coocox настройка heap?

    Вроде пришло понимание части вопросов! Что привело к возникновению еще большей "куче" вопросов. Из того что понятно: - из этого понятно что верх стека по адресу 0x20000888 + 0x800(размер стека) = 0x20001088. Это значение записано и по адресу 0x08000000. За адресом 0x20001088 у нас больше ничего уже не будет хранится. то есть в данном случае я могу увеличить размер стека до значения 0x20020000 - 0x20000888(до этого адреса хранятся глобальные переменные). Теоретически куча может не то что встретится со стеком, а стереть его полностью, добравшись до точки В. То же самое может сделать и стек с кучей, если он доберется до точки А. Так? Стек растет сегментами, в которых хранятся локальные переменные функции и адрес возврата. Чем больше локальных переменных в функции, тем больше сегмент стека. Если нужна локальная переменная большого размера, а точнее мы не знаем какого размера она будет, но знаем что может быть большой - лучше ей память выделить динамически из кучи то-есть области ближе к точке А. И при этом стек у нас вырастет не значительно. Про ограничения стека и кучи (как я это понял)! По факту мы не имеем каких то конкретных размеров стека и кучи. Размер стека от заданной его вершины и до начала локальных данных. Размер кучи с начала памяти локальных данных и до конца памяти. Превышение лимита стека контролируется вылетом в прерывание HardFault (если такое происходит, значит полная же.. и нужно делать переорганизацию памяти, увеличивать стек или выбирать проц с большей памятью. Превышение лимита кучи контролируется через некое ограничивающее значение, наверное __HeapLimit, если вообще контролируется это. На сколько я понял этот контроль настраивается в функции _sbrk, ее специально оставили пользователю. То есть там нужно сделать проверку, если пытаемся выделить память за пределами HeapLimit, тогда не выделять память. А теперь собственно вопросы: Это значение HeapLimit должно ведь быть динамическим. Ну типа до указателя стека, стек вырос и HeapLimit уменьшилось, стек уменьшился и HeapLimit увеличился? Иначе зачем тогда стек и кучу пихать в один сегмент памяти! Если у нас верх стека это конец памяти, а начало кучи начало локальных данных где тогда ОС(в частности freertos) размещает свои стек и кучу?
  2. Coocox настройка heap?

    Да нет, схему я как раз понял. Только в стандартном варианте было примерно так, в понедельник точный map на работе посмотрю и покажу. .heap 0x200055a0 0x0 0x200055a0 __end__ = . 0x200055a0 _end = __end__ 0x200055a0 end = __end__ *(.heap*) .co_stack 0x200055a0 0x2000 ...... 0x200055a0 . = ALIGN (0x8) *(.co_stack .co_stack*) 0x200055a0 0x2000 ...... 0x200055a0 __HeapLimit = . 0x20020000 __StackTop = ....... 0x2001e000 __StackLimit = ....... Я думал что co_stack это начало стека, и адрес кучи находится там же где и начало стека. По этому и начал пытаться перенести кучу. Точнее вообще понять где она расположена, и как задать ей размер. P.S. Я подключил библиотеку декодера speex, и при его инициализации у меня программа улетала в Default_Handler. Скорее всего из за того, что происходило прерывание, обработчик которого я не включил (наверное прерывание по переполнению стека). Программа улетала, когда выполнялась calloc 3-й раз. Я увеличил значение STACK_SIZE и все пошло. Получается что calloc выделяло память из адресного пространства стека (возвращало 0x200055a8), а адрес начала стека все таки 0x200055a0? Или я все не так понял?
  3. Coocox настройка heap?

    Во первых, огромное спасибо за наглядную картинку - сразу много вещей стало понятно! Редко на форуме понимают тех кто только начинает осваивать новое. Из вашего ответа, у меня напрашивается законный вопрос, почему на всех встречающихся примерах всегда указывается размер стека, и кучи? Честно говоря я думал что стек и куча ограничиваются размером. P.S. Это coocox делает по умолчанию в new_project. и GCC предлагает свой ld с таким расположением. Только вспомнил! По адресу 0х08000000 указан адрес 0х200055А8. То есть начало стека, так что получается что стек двигается с этого адреса в конец памяти?
  4. Coocox настройка heap?

    Не получается настроить кучу в coocox. По тем пример что на форуме http://www.coocox.org/forum/viewtopic.php?f=2&t=917 у меня не получилось. Во первых потому, что они с ошибками, а во вторых там не указано куда именно в файле *.ld нужна сделать вставку. В общем я сделал по другому: 1. В файле startup добавил /*----------Heap Configuration-----------------------------------------------*/ #define HEAP_SIZE 0x00001000 __attribute__ ((section(".heap"))) unsigned long pulHeap[HEAP_SIZE]; 2. В файле ld перенес сектор .heap который там уже был, под сектор .co_stack /* .stack_dummy section doesn't contains any symbols. It is only * used for linker to calculate size of stack sections, and assign * values to stack symbols later */ .co_stack (NOLOAD): { . = ALIGN(8); *(.co_stack .co_stack.*) } > ram .heap (COPY): { __end__ = .; _end = __end__; end = __end__; *(.heap*) __HeapLimit = .; } > ram /* Set stack top to end of ram , and stack limit move down by * size of stack_dummy section */ __StackTop = ORIGIN(ram ) + LENGTH(ram ); __StackLimit = __StackTop - SIZEOF(.co_stack); PROVIDE(__stack = __StackTop); /* Check if data + heap + stack exceeds ram limit */ ASSERT(__StackLimit >= __HeapLimit, "region ram overflowed with stack") В файле syscalls.c вообще ничего не менял. Вот map файл который получился, и как видно из скриншота, функция calloc возвращает указатель именно из области сектора .heap Но только не пойму как работает ограничение, когда вылезаем за размеры кучи. Дело в том, что даже если я ставлю HEAP_SIZE 0x00000010. Программа работает но там явно память выделяется за границами кучи.
  5. Подскажите во время отладки в CoIDE где можно узнать адреса по которым расположены переменные?
  6. Блин сам и напоролся. Смотрел конфиг из чужого проекта, там было #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ). А то что у меня 75 стоит и не обратил внимания!
  7. Подключил FreeRTOS, пока практически пустой проект 3 задачи для теста - 1-я контроль кнопки, 2-я передача строки "Hello World" в UART и 3-я мигание индикаторами. Хотя в FreeRTOSConfig.h и стоит #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) ) , но в SRAM забрало очень много места, почти 60% всей ОЗУ. Подскажите почему так? Смотрел в map файле я так понимаю что все жрет heap_2.c
  8. А где именно это можно сделать, можно подробнее?
  9. Не адреса я смотрю в отладчике, а в бинарнике вижу что он совсем отличается от того что выдаёт отладчик. Данные с бинарника похожие на то что в отладчике только когда я собираю проект без смещения.
  10. Смотрю на адрес 0x00000004 потому что внем записано 0x00010101 и у меня отладчик висит на этом адресе после старта. Хотя смотрел бинарник после компиляции, там вроде все верно. (по крайней мере код программы есть) Наверное я что то делаю не так. Можете поэтапно указать все изменения проекта под бутлоадер от стандартного проекта, пусть даже который создаем через визар.
  11. При установке в настройка линкера CooCox старт адреса 0x08001000, после компиляции и запуска отладки у меня во втором слове памяти по адресу 0x00000004 почему весит значение с адресом 0x00010101. Да и вообще я вижу, что в памяти какая то бяка вместо моей программы.
  12. Тогда не верно выразился, нужно так - "Так все правильно будет работать?" . Учитывайте тот факт, что я вообще только начал изучение STM32. И еще один вопрос в нагрузку: - когда я ставлю в линкере основного проекта адрес 0x08001000, то после компиляции при переходе в отладку, у меня все весит по адресу 0x00000000. Ну это и понятно, потому что там ничего нет. Тогда как отлаживать? Сначала делаем программу как обычную не под бутлоадер, то есть не меняя в ней адрес таблицы векторов и не трогая линкер. А после того как проект готов, ставим в начало main SCB->VTOR = 0x08001000; и корректируем линкер. Или нужно что то еще?
  13. Вот два кода, первый бутлоадера, а второй моя программа. Так нужно делать? //В проекте бутлоадера int main(void) { //Здесь код бутлоадера //здесь переопределение адреса таблицы векторов прерываний //и переход к выполнению основной программы __disable_irq (); __set_MSP( *(uint32_t*)(0x08001000) ); SCB->VTOR = 0x08001000; (*(void(*)(void))( *(uint32_t*)(0x08001000+4) ))(); } //В проекте с основной программой int main(void) { SCB->VTOR = 0x08001000;//и в линкере проекта основной программы установить адресацию с 0x08001000 //Дальше код основной программы }
  14. Сейчас разбираюсь с юзерским бутлоадером. Почитал про систему прерываний Cortex, она кардинально от PIC отличается но в принципе все понятно. При старте мы сразу попадаем в прерывание Reset и из него уже выходим в нашу main(). Как все организовать я понял. Только не получается перенести вектор прерываний как в бутлоадере когда переходим к выполнению основной программы, так и в основной программе (ее ведь необходимо сместить выделив место под бутлоадер). Нашел пример бутлоадера, там для этих целей используется функция NVIC_SetVectorTable(). У меня в функциях NVIC файла core_cm4.h такой нет.
  15. STM32F407VG. Как в программе выполнить reset? В PIC можно было функцией RESET();
  16. Точно, спасибо. Не правильно перевел мануал, регистр SYSCFG как и положено находится в структуре регистров. Этот адрес устанавливается по состоянию регистра SYSCFG (состояние ножки boot)?
  17. Продолжаем разбираться. Получил железо, просмотрел несколько уроков, помигал светодиодами, передал в UART. Все вроде не особо сложно, так как сотни примеров есть. Начал разбираться с чего же все начинается. Тут уже инфы меньше и полез смотреть в мануал. Просьба поправить меня если я что то не так понял: - Все начинается с адреса 0000 0000 (собственно это регистр syscfg_memrmp), который принимает значения состояния штырьков boot; - У него только младшие 2 байта, которые указывают с какого места продолжить загрузку; - Есть 3 варианта flash, SRAM и System memory. Во Flash наша основная программа, в System memory заводской бутлоадер, а в SRAM может быть любая временная программа (возможно даже свой бутлоадер, пока еще толком не понял). - Из Flash мы запускаемся когда мы выполняем основной алгоритм работы. - Из System memory если хотим обновить прошивку (не совсем понятно зачем это нужно, на сколько я понял у него нет шифрования данных, то есть прошивка должна иметься открытая). Ну возможно для каких то целей отладочных и пригодится. - Из SRAM мы не можем загрузиться с первого раза, так как в нем будет бяка после подачи питания. Нужно первый раз загрузится нормально, записать в SRAM код программы которую нужно выполнить из SRAM, программно установить syscfg_memrmp для загрузки из SRAM и выполнить программный reset.
  18. Спасибо, собственно таких ответов я и ожидал! И Вам спасибо. И таких ответов хотелось. Понятно что нужно детально изучать все доки. Но вначале нужно иметь грубое поверхностное представление. Почитать статьи, примеры, а потом получив базовое представление лезть в дебри.
  19. ROM - я имею ввиду память программ. Да что за люди, уже написал конкретный вопрос, а вместо помощи пытаются отписаться и показать себя умнее всех. Вы когда объявляете константы вы пишете const rom int x или const flash int x? Интуитивно можно понять что я имею ввиду. Так я собственно и спрашиваю discovery с каким из этих МК лучше выбрать? АЦП нужно просто мерить входное напряжение (мультиметр)
  20. Во избежание лишних дискуссий буду задавать более конкретные вопросы. Помогите с выбором платы DISCOVERY в моем случае, для каждого МК я выписал основные критерии которые считаю важны для меня, возможно я что-то упустил: STM32F401VC: ROM - 256 RAM - 64 ADC - 16ch DMA - для загрузки аудио файлов без проца Комуникация UART, SPI, I2C SDIO - если флешь будет карта SD audio PLL - эта штука мне не понятна, нужна ли она мне будет для воспроизведения аудио? STM32F407VG ROM - 1024 RAM - 129 ADC - 16ch (вижу что в линейке есть и на 24 ch) DMA - для загрузки аудио файлов без проца Комуникация UART, SPI, I2C SDIO - если флешь будет карта SD Не вижу audio PLL STM32F411VE (На мой взгляд наиболее подходящий и цена на проц приемлемая) ROM - 512 RAM - 128 ADC - 16ch DMA - для загрузки аудио файлов без проца Комуникация UART, SPI, I2C SDIO - если флешь будет карта SD audio PLL - эта штука мне не понятна, нужна ли она мне будет для воспроизведения аудио?
  21. Спасибо! Я собственно на ST пока и остановился, так как по ним много примеров есть.
  22. Согласен. Тут я понял, сбило с толку SPI. Просто я уже писал что знакомлюсь с ARM только второй день и попутно еще про плис читал. И в голове пока каша, там что то про то что основная программа загружается с внешней памяти, в ARM что то про шину взаимодействия периферии без участия процессора и т.д. В общем пора отдыхать, завтра будем воевать дальше. А то пока эти свободные радикалы в голове до кучи соберешь, можно и свихнуться.
  23. Не плата а МК который в ней.
  24. Возможно я и ошибаюсь, просто я бегло просматривал архитектуру МК NUC505 Series от нувотон, и как я понял из этого Memory - 128 KB of embedded SRAM - 2 MB of SPI Flash То он как раз использует в качестве ОЗУ внешнюю флешь через какую то специальную I2C шину. Может я ошибаюсь? К сожалению только пару дней как начал заниматься этим вопросом, по этому и интересуют советы понимающих людей. Допустим дискавери есть с разными МК. Не хочется взять с контроллером которого может не хватить для моего проекта. Допустим на PIC в этом проекте у меня было занято из 128kB около 80%. И если я возьму отладочную плату с ARM на 128kB в котором попробую реализовать свой проект, хватит ли мне его памяти когда нужно еще ауди декодер какой туда впихнуть, а еще хотелось бы какую нибудь ОС (проект не маленький, на pic я использовал OSA) . Просто не зная аппетиты ARM, тяжело выбрать верное решения. А осваивать нужно имея на руках железо, а не только мат. часть. STM32F4 Discovery это хорошо, но бюджет не резиновый и хотелось бы реализовать проект на МК из серии F0. Или взять STM32F4 Discovery все сделать, а потом смотреть в какой более дешевый МК все это можно будет засунуть? Взять заведомо мощнее МК я боюсь напороться на невозможность непереносимости проекта на более простой МК (например с F4 на F0). Потому как пока еще не понимаю разницу между ними. Ну кроме явных параметров, таких как память и быстродействие. Может это как написать проект под PIC32 а потом пытаться его перенести на pic12
  25. Освоение ARM контроллеров

    Появилась необходимость в освоении ARM контроллеров. Есть проект реализованный на PIC контроллере, который необходимо портировать на ARM. Это связано с тем, что в него нужно доработать реализацию воспроизведения аудио файлов. Просьба помочь в выборе контроллера и отладочных средств к нему для изучения ARM, с учетом моих задач. Просто не хочется брать первую попавшеюся отладочную плату с установленным в нее контроллером. А выбрать тот набор оборудования и ПО, который поможет мне в изучении ARM и параллельно реализовать все мои задачи. Основные параметры основываясь на старый проект: 1) Объем памяти программ не меньше 128kB. 2) Объем памяти данных не меньше 4kB. Учитывая что в старом проекте используется внешняя EEPROM для хранения параметров на 64kB, а в новом проекте еще и нужно хранить аудио треки. И насколько я успел поверхностно ознакомится, в ARM можно использовать внешнюю flash память и для памяти данных контроллера и для хранения треков и параметров. Если я прав, то тогда ARM можно брать вообще без внутреннего ОЗУ. 3) Большое количество портов. В старом проекте был PIC на 80 ног. 4) Нужно 17 АЦП для измерения напряжения, остальные GPIO. 5) 2 порта UART. 6) Желательно USB. 7) И самое главное возможность проиграть аудио ролики (не важно в каком формате хоть в “amr”) в аудио тракт GSM модема. Эти ролики будут подготовлены на ПК и записываться в цифровом формате во внешнюю flash (то есть никаких кодеков для записи аудио не нужно). Есть под ARM готовые библиотеки для воспроизведения аудио файлов? В качестве среды разработки хочу взять CooCox CoIDE (GCC Compiler) в виду того что она бесплатная. Вроде неплохие отзывы о ней. Кстати кто знает, в ней есть ОС под ARM. ARM контроллер и отладочный комплект ST или NuVotone. Лучше ST так как на мой взгляд они наиболее популярны, а по второму производителю маловато информации в сети. Заранее благодарен за любую помощь.
×
×
  • Создать...