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

misyachniy

Свой
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о misyachniy

  • Звание
    Знающий
    Знающий
  • День рождения 14.10.1966

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

6 029 просмотров профиля
  1. В sml2.cpp были и код и данные. Перевернул весь проект с ног на голову или наоборот ;-). Все файлы которые относились к проекту sml2 свел в один. Из sml3.cpp все переменные и функции перенес в sml2.cpp. Таким образом в проекте(project group) только 2 файла общих для ядер A и B - sml2.cpp и sml3.cpp. В sml3.cpp объявлен только буфер для данных, которые поступают из PPI DMA. В результате все свелось к одной ошибке В интернете только одна такая есть https://ez.analog.com/dsp/software-and-development-tools/visualdsp/f/q-a/70293/bf561----error-li1152 "The error message tells you what library, and what objects within the library, are causing the conflict. You should then check your LDF for any INPUT_SECTIONS commands that map these libraries/objects, and ensure that there are not multiple INPUT_SECTIONS commands mapping the same data." Не понятно что искать? Функции с одинаковыми объявлениями или переменные? И почему компилятор даже варнинга не выдал? P.S. Видел переменные с одинаковым именем в проекте. Одна объявлена как "глобальная" вторая как ststic внутри функции. не может быть наложения друг на друга?
  2. Немного потестил. Переменные и функции sml2 связаны с coreA. С coreB ничего связано. Переменная объявленная в sml2, в coreA работает без вопросов. Как только test_share_data объявляю в coreB, сразу начинают сыпаться ошибки линкера о неизвестных переменных и функциях при линковке ядра B. Похоже некорректные объявления. Тело функций и переменные объявлены в coreA, в sml2 как extern. Линкер перепроверяет (?) соответствие и не может проверить? Завтра продолжу исследования.
  3. В sml2 объявлено много переменных и функций. Весь проект собирается и работает. Как только добавляю test_share_data, линкер высыпает много ошибок, я привел часть: две переменные "ANG " и "Ampl " и функцию "ANLS_FLD(int, int) " Обычно компилятор еще на стадии анализа текста выдает ошибку при присвоении начального значения переменной объявленной как extern. Завтра попробую еще поэкспериментировать может дополнительная инфа появится.
  4. Подправлял рабочий проект доставшийся в "наследство". Все нормально собирается и работает, до тех пока попробовал добавить еще одну переменную в разделяемую память Добавил одну переменную test_share_data. #pragma file_attr("sharing=MustShare") #pragma section("l2_sram") volatile int test_share_data; volatile short RP_count3=0; Компилятор транслирует без вопросов, а линкер выдает следующую ошибку: [Error li1021] The following symbols referenced in processor 'p1' could not be resolved: 'ANG [_ANG]' referenced from 'sml2.dlb[sml2.doj]' 'ANLS_FLD(int, int) [_ANLS_FLD__FiT1]' referenced from 'sml2.dlb[sml2.doj]' 'Ampl [_Ampl]' referenced from 'sml2.dlb[sml2.doj] То есть, не видит часть переменных и функций.
  5. Вопрос был в интерпретации "[]" в дефайнах. Сегодня все отладил, квадратные скобки никак не интерпретируются. То есть сам напутал. Тему можно закрыть. Всем спасибо.
  6. В чужом проекте решил упорядочить разрозненные параметры, передаваемые/принимаемые по интерфейсу, в простую и понятную форму. Параметров полтора десятка. Вначале объявил массив volatile int parametrs[16]; и два дефайна #define MIN_NUMBER 1 и #define MAX_NUMBER 15. Смысл в том чтобы переписать switch/case из 15 строк в такое выражение: if ((num<=MAX_NUMBER) && (num >=MIN_NUMBER )) parametrs[num] = value; Так как переменные используются многократно в тексте и переписывать их не хочется. Часть описана как volatile int, часть как extern volatile int Решил сделать переобъявления дефайнами. #define minimum_temp parametrs[1] #define maximum_temp parametrs[2] .... #define maxt_timer parametrs[15] Рассчитывал, что все срастется и скомпилируется без вопросов. Но компилятор упирается. Порыскал по интернету, пока не кончился рабочий день - ответа не нашел. По этой ссылке https://www.opennet.ru/docs/RUS/cpp/cpp-5.html утверждается: "Однако, не существует каких либо ограничений на использование квадратных или угловых скобок. Например macro (array[x = y, x + 1]) передает макросу 'macro' два аргумента: 'array[x = y' и 'x + 1]'." У меня нет аргументов и препроцессор должен по дейфайнам просто заменить обращение к переменным на обращение к отдельным элементам массивов простой подстановкой. Или я что-то путаю?
  7. Понадобилось запустить UART с возможностью отработки таймаута по приему. В самом UART такой вариант отсутсвует. Пробовал с помощью обычного таймера. Но в нем счетчик без возможности записи со стороны процессора. Корректно перезапускать не получилось. Более менее получилось с Watchdog. Вот так описал прерывание #define WDTPERIOD 10000 EX_INTERRUPT_HANDLER (Watchdog_ISR) { *pWDOGB_CNT = WDTPERIOD; *pFIO0_FLAG_T = DBG_PIN; // toggle asm("ssync;"); } Вот так настраиваю сам Watchdog: void WDOGinit (void) { // Запрет сторожевого таймера: *pWDOGB_CTL = WDDIS; ssync(); // Инициализация счетчика: *pWDOGB_CNT = WDTPERIOD; ssync(); register_handler(ik_ivg13, Watchdog_ISR); /* Note that if the general-purpose interrupt option is selected, the System Interrupt Mask register (SIC_IMASK) should be appropriately configured to unmask that interrupt. */ // Table 4-7. Peripheral Interrupt Source Reset State //Watchdog Timer interrupt - 59 - IVG13 - SIC_IMASK1 == 27 // разрешение логической 1 *pSICB_IMASK1 |= SIC_MASK(27);\ // Разрешение сторожевого таймера, генерировать обычное прерывание // при срабатывании сторожевого таймера: *pWDOGB_CTL = WDEN | WDEV_GPI; // 0x0FF0 | 0x0004 ssync(); *pWDOGB_STAT = 0; } Реально удалось загрузить на лету и прошить работающую версию с WDTPERIOD = 1000. На выходе видно частоту чуть больше 2МГц. Как только поменяю значение на другое - или нет сигнала на выходе или остается "старый" или отваливается эмулятор. В сети нашел примеры для BF-60x : adi_int_InstallHandler(INTR_WDOG1_EXP, wdtISR, NULL, true); _wdtDisable(); _wdtSetTimeout(wdtPeriod); _wdtEnable(); Но таких функций в примерах в моем VDSP нет. "INTR_WDOG1_EXP" - ни одной ссылки в Интернете. Понятно, что с порядком обращения к регистрам проблема, но как найти?
  8. Вопрос решен unsigned int mem_SDGCTL = SCTLE | CL_3 | TRAS_6 | TRP_3 | TRCD_3 | TWR_2 | PSS | FBBRW | 0x80000000; 0x80000000 - это бит который переводит EBIU в режим 16 бит. Когда он сброшен - 32 бита. В HW reference он описан как "X16DE" В хидерах - отсутствует.
  9. Использовали плату BF561 с одним модулем памяти на 64 мегабайта 16 бит. Для нее был написан простенький тест памяти. Сейчас плату переразвели на 2 микросхемы памяти. В результате получили те же 64 мегабайта, но шина данных 32 бита. Залил старую программу - ростейший тест с бекущей "1" по шине данных не идет. Заполняет память как на картинке. Взял документ EE-326 "Blackfin® Processor and SDRAM Technology" Перепроверил схему на соответствие рекомендациям - все соответствует. Поискал информацию, как переключить шину 16 на 32 - не нашел. Есть рекомендации по настройке линкера, при размещении данных в SDRAM. Но в тестирующей программе размещение данных/кода в SDRAM не используется. Вот функция инициализации SDRAM контроллера void sdram_config() { unsigned int mem_SDRRC; unsigned int mem_SDGCTL = SCTLE | CL_3 | TRAS_6 | TRP_3 | TRCD_3 | TWR_2 | PSS | FBBRW | 0x80000000; // calculating EBIU_SDRRC double t_ref = 64 * 1e-3; double sclk = ((double) get_sclk()); // Hz unsigned int row_number = 13; unsigned short t_ras = (mem_SDGCTL >> 6) & 0xF; unsigned short t_rp = (mem_SDGCTL >> 11) & 0x7; mem_SDRRC = (sclk * t_ref) / (1 << row_number) - (t_ras + t_rp); // disable SDRAM Bank0 *pEBIU_SDGCTL &= 0xFFFFFFFE; *pEBIU_SDRRC = mem_SDRRC; *pEBIU_SDBCTL = EB0_E | EB0_SZ_64 | EB0_CAW_10; *pEBIU_SDGCTL = mem_SDGCTL; } Ну и извечных два вопроса: Кто виноват, что делать?
  10. Нужно описать, что происходит. Светится светодиод или нет? Как пересылаете числа в порт? К тому же при нажатии "2" в порт передается ASCII код 50 а не 2. https://www.ibm.com/docs/ru/sdse/6.4.0?topic=configuration-ascii-characters-from-33-126 Лучше использовать Serial.read() https://www.arduino.cc/reference/en/language/functions/communication/serial/read/
  11. Схему можно нагуглить В любом случае ток будет пилообразный. Если считать, что пила идеальная, то наверное нужно измерять ток в двух точках при открытых ключах. Также нужно учитывать скважность. В любом случае тыкнуть осциллографом в датчик не мешало бы. Может там еще иголки от мотора прут.
  12. У каждого свой метод чтения. Я такие конструкции сведу в один абзац и все будет читаемо. 9'd70 - адрес переменной переменной, UV_Z - наименование переменной, все что в средине базовый адрес и сигналы разрешения и так понятны. Могу скопировать массив строк в программу процессора и сравнить с текстом программы if (((Adress_Config == (9'd70 + 9'd256)) & ack_config & Debug) UV_Z <= Data_Config[13:1]; По поводу "достаточно открыть сгенерированный нетлист. " - ничего не могу сказать.
  13. Перебираю чужой проект. Подчищаю и "переписываю под себя". Для проверки сравниваю sof файлы "старый" и "новый." Есть вот такая конструкция always @ (posedge clk) begin begin if(Adress_Config == (9'd70 + 9'd256)) begin if(ack_config == 1'b1 && Debug == 1'b1) begin UV_Z <= Data_Config[13:1]; end end end end Я убрал лишне if ((Adress_Config == (9'd70 + 9'd256)) && (ack_config == 1'b1 && Debug == 1'b1)) UV_Z <= Data_Config[13:1]; Сравнение файлов показывает различия. По школьным знаниям могу предположить, что в первом варианте реализуется "приоритетный шифратор", во втором - "дешифратор". На мой взгляд функционировать должно одинаково, но почему генерится другой файл? //----- Ну и чтобы два раза не вставать, встретил два таких оператора вместе if(RM_Rise == 1'b1) Dis_Foto <= 1'b1; if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0; Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться. Как работает такая конструкция?
  14. Точно. Только не user manual а reference manual нужно смотреть. Спасибо.
  15. Хочу вписать в do файл команды для закрытия не нужных мне окон. Названия окон есть в руководстве. Есть команда показать окно. Например : А закрыть нету. пробовал close, hide не помогает.
×
×
  • Создать...