Jump to content

    

jenya7

Участник
  • Content Count

    3216
  • Joined

  • Last visited

Community Reputation

0 Обычный

About jenya7

  • Rank
    Гуру

Recent Profile Visitors

8797 profile views
  1. а как мне сделать мап на SDRAM? кстати они пытаются запихнуть в NCACHE секцию __attribute__((section("NonCacheable,\"aw\",%nobits @"))) static uint32_t s_frameBuffer[2][1280][720] __attribute__((aligned(64))) а она по идее довольно вместима Memory region Used Size Region Size %age Used NCACHE_REGION: 0 GB 16 MB 0.00% почему компилятор видит SRAM_DTC_cm4 секцию? Я посмотрел сгенерированный линкер у примера /* BSS section for NCACHE_REGION */ .bss_RAM2 : ALIGN(4) { PROVIDE(__start_bss_RAM2 = .) ; PROVIDE(__start_bss_NCACHE_REGION = .) ; *(NonCacheable) *(.bss.$RAM2) *(.bss.$NCACHE_REGION) *(.bss.$RAM2.*) *(.bss.$NCACHE_REGION.*) . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */ PROVIDE(__end_bss_RAM2 = .) ; PROVIDE(__end_bss_NCACHE_REGION = .) ; } > NCACHE_REGION AT> NCACHE_REGION А мой /* BSS section for SRAM_ITC_cm4 */ .bss_RAM2 : ALIGN(4) { PROVIDE(__start_bss_RAM2 = .) ; PROVIDE(__start_bss_SRAM_ITC_cm4 = .) ; *(.bss.$RAM2) *(.bss.$SRAM_ITC_cm4) *(.bss.$RAM2.*) *(.bss.$SRAM_ITC_cm4.*) . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */ PROVIDE(__end_bss_RAM2 = .) ; PROVIDE(__end_bss_SRAM_ITC_cm4 = .) ; } > SRAM_ITC_cm4 AT> SRAM_ITC_cm4 Где я привязываю NonCacheable к NCACHE_REGION? Всё. Нашёл. Секцию надо прописать в Settings->MCU Linker->Managed Linker Script
  2. Создаю Chronometer Chronometer chronometer; Создаю Start, Stop, On Tick ивенты @Override protected void onCreate(Bundle savedInstanceState) { chronometer = new Chronometer(this); btn_start.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { TimerStart(); } }); btn_stop.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { TimerStop(); } }); chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { @Override public void onChronometerTick(Chronometer chronometerChanged) { chronometer = chronometerChanged; count++; txt_count.setText(String.valueOf(count)); if (count >= seconds) { count = 0; //play sound } } }); } И Start, Stop методы void TimerStart() { seconds = Long.parseLong(txt_seconds.getText().toString()); count = 0; chronometer.setBase(SystemClock.elapsedRealtime()); chronometer.start(); is_running = true; } void TimerStop() { chronometer.stop(); is_running = false; } Запускаю chronometer и ставлю точку останова на count++; линии в onChronometerTick. Я попадаю туда только один раз хотя seconds = 100. Что я упускаю?
  3. Включил emWin GUI в проект для MIMXRT1160-EVK. Честно взял их пример и при компиляции получаю Смотрю в коде #define APP_IMG_HEIGHT 1280 #define APP_IMG_WIDTH 720 AT_NONCACHEABLE_SECTION_ALIGN(static uint32_t s_frameBuffer[2][APP_IMG_HEIGHT][APP_IMG_WIDTH], FRAME_BUFFER_ALIGN); Естественно такой монструозный буфер не влезет ни в одну секцию памяти. Я что то упускаю?
  4. Создал проект в MCUXpresso IDE v11.4.1_6260 для i.MX RT1160 MCU (SDK_2_10_0_MIMXRT1166xxxxx.zip). Пытаюсь скомпилировать пустой проект и в LWIP вываливается куча ошибок В чём может быть проблема?
  5. Исчезли датчики ACS722LLCTR-10AU-T ACS724LLCTR-10AU-S ACS725LLCTR-10AU-T то есть исчезли по нормальной цене. теперь они стоят 65$. Чем можно заменить? Мне нужно pin compatible так как платы уже напечатали.
  6. я его так и не задействовал. не понадобился. только сейчас дописал в него код.
  7. я сначала заполняю структуру - RCC_GetClocksFreq(&RCC_Clocks); и RCC_Clocks.HCLK_Frequency = 72000000 (насколько я помню, хотя конечно надо проверить). давно это было но я все делал по инструкции я просто вычитываю то что CCR1 натикал между двумя ниспадающими фронтами. да флаг сбрасывается при чтении, но я не нашёл упоминания в мануале что чистить его вручную это криминал. а для всех исключительных ситуаций предназначен таймаут - if(TIM17->SR & TIM_IT_Update).
  8. спасибо. не помогут приоритеты перейду на DMA.
  9. ой. насчет флага это очень верное замечание. UEV я хотел использовать на случай таймаута. а как DMA настроить? что будет тригером? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&TIM17->CCR1; // Source DMA_InitStructure.DMA_MemoryBaseAddr = (u32)& ir_captures[0]; // Destination так что ли? кстати я могу проверять на шум при принятии сигнала ir_captures[ir_idx++] = TIM17->CCRx; вопрос если завалился один бит стоит ли выбрасывать из за этого весь фрейм или лучше подлатать каким нибудь алгоритмом при парсинге команды.
  10. то есть таймер захвата сигналов с пульта - нулевой приоритет а системный таймер - скажем 1? а что системный таймер может пропустить счет или просто будет джитер? ну даже если пропустит это не столь критично. я пользуюсь библиотечной ф-цией __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ } чтоб не лезть в нее грязными руками выставлю приоритет отдельно. SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); NVIC_SetPriority (SysTick_IRQn, 1);
  11. Добавил в проект прерывание системного таймера. Каждую милисекунду. void SysTick_Handler(void) { motor_rt_params.run_timer++; } Люди начали жаловатся что прием команд с телевизионного пульта ухудшился. Срабатывает один раз на несколько нажатий. Раньше прием работал очень четко, жалоб не было. Прием команд телевизионного пульта осуществляется тоже по прерыванию, по прерыванию таймера (capture/compare) void TIM1_TRG_COM_TIM17_IRQHandler(void) //ir signal detection { if(TIM17->SR & TIM_IT_Update) //timeout { TIM17->SR = (uint16_t)~TIM_IT_Update; } if(TIM17->SR & TIM_SR_CCxIF) { TIM17->SR &= ~TIM_SR_CCxIF; #if SIRC_PROTOCOL switch(ir_state) { //first falling edge case IR_IDLE: TIM17->CNT = 0; ir_state = IR_START; break; //start bit case IR_START: TIM17->CNT = 0; if(TIM17->CCRx > IR_START_BIT_MIN) //2.3mS-2.5mS valid start bit ir_state = IR_BITS; else ir_state = IR_IDLE; break; //data bits case IR_BITS: ir_captures[ir_idx++] = TIM17->CCRx; TIM17->CNT = 0; if(ir_idx >= ir_data.bits) { IR_TIM_STOP; ir_state = IR_DONE; ir_rx_ready = 1; } break; } #endif //TIM17->SR &= ~TIM_SR_CCxIF; } } Сам фрейм на сони вроде как 20 милисекунд так что проблема вполне имеет место быть. Что можно сделать? NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 2); ? Приоритет помогает? (железо не у меня, я работаю удаленно, на месте проверить не могу).
  12. сначала скрипты были пару десятков строк. но аппетиты у народа растут и они пишут скрипты на сотни строк. соответсвенно ОЗУ отжирается. там осталось всего на донышке. я когда разрабатывал систему подошел к этому как то легкомысленно. поначалу ОЗУ было море, я как то не парился особо. потом начали расти аппетиты, давай сделаем такие примочки, давай сякие, вообщем стою на пороге смены камня. запас по времени есть, но я пытаюсь сэкономить, опять таки - народ в скриптах грузит систему нипадетски я пытаюсь соптимизировать по скорости всё что можно.
  13. (4 байта указатель + 4 байта переменная ) * 10 таймеров это если делать по принципу Eddy_Em. if (TIMx == TIM6) else if (TIMx == TIM7) я не хочу. все эти сравнения влияют на время исполнения.
  14. и сколько myTim мне нужно? сегодня мне нужен TIM6, TIM7 а завтра добавяться TIM1, TIM3, TIM8. держать массив на все таймеры? я пытаюсь сэкономить, у меня RAM кончается.