FreeRtos – xQueueSendToFrontFromISR – assertion failure

I dag havde jeg er problem med at sende data til en FreeRtos queue fra et interrupt kald. Problemet var, at når jeg kaldte xQueueSendToFrontFromISR crash’ede systemet med en assertion. Det viste sig at FreeRtos ikke tillader at have en interrupt med en højere prioritet end configMAX_SYSCALL_INTERRUPT_PRIORITY, så problemet blev løst ved at sætte interrupt prioriteten. Det gøres ved, at kalde HAL_NVIC_SetPriority som vist nedenfor. HAL_NVIC_SetPriority(SPI_MASTER_A_DMA_Rx_Stream_IRQn, 10, 0); HAL_NVIC_SetPriority(SPI_MASTER_A_DMA_Tx_Stream_IRQn, 10, 0);   /Flemming Jahn  

Read More

Boganmeldelse : Scott Meyers – Effective C++ : 55 specific ways to improve your programs and designs ½

Lad det være sagt med det samme. “Effective C++ : 55 specific ways to improve your programs and designs”  er ikke en nem bog at læse. Det er ikke en bog for begyndere, og kræver nok at man har et par års erfaring med at programmere C++ før man kan få noget ud af den. Jeg synes ikke, det er en bog man skal læse fra enden til anden, men den er god som opslagsbog, når man lige vil sikre sig, at man laver en specifik programmerings teknik effektivt. Bogen indeholder…

Read More

ST32 og I2C write + read i en transaction

Når man skal lave en I2C læsning med ST findes der HAL funktioner til dette. Problemet med standard funktionerne er, at de færdiggør hver læsning og skrivnings transaction før næste transaction kan udføres. Nogle peripherals kræver, at man opsætter register adressen før man laver læsningen. Samtidig kræver nogle peripherals, at det sker i en transaction. Heldigvis har ST også en HAL funktion til dette. Det hedder ikke helt logisk HAL_I2C_Mem_Read. Nedenstående kode viser hvordan jeg har brugt dem.   static const uint8_t USBHUB_I2C_ADDR = 0x58; extern I2C_HandleTypeDef i2c1; typedef uint8_t usbHubRegData_t; typedef…

Read More

Lav et Ethernet loopback med FreeRtos ogLWIP

Vores produkt har et Ethernet interface, og vi har et ønske om at kunne lave en selftest af dette interface ved, at lave et loopback i PHY’en, så sende en pakke på interfacet, og checke at vi modtager den samme pakke. Vi bruger LWIP og FreeRtos, og nedenstående kode viser hvordan en sådan selftest kan laves. static const char loopbackFrame[] = “Sending loopback test frame”; static const uint16_t frameSize = sizeof(loopbackFrame); static testResult_e ethernetSelfTestLastResult = FAILED; // Call whenever a frame is received according to the bind in ethernetSelftest() static…

Read More

Cache coherence problem med STM Cortex M7 processor

Selvom jeg har arbejdet med embedded systemer i mange år, kan jeg stadig støde på ting jeg ikke har prøvet før. Et problem jeg ikke havde stødt på før er et problem, der hedder ”cache coherence”, og som jeg lige har brugt laaaang tid på. Problemet viste sig ved, at mit system pludselig begyndte at opføre sig meget underligt og ustabilt. Jeg fandt ret hurtigt ud af, at problemet forsvandt, når jeg reducerede FreeRtos’s heap størrelse, men det tog lang tid, at finde ud af hvorfor. Problemet var at noget…

Read More

Sådan bruges Ruby til at kommunikere via RS232

Jeg bruger ofte Ruby som script sprog til, at lave test systemer til test af mine embedded projekter. Dette kræver, at man kan kommunikere mellem det embedded system og test computeren. Dette gøres nemt via en RS232 forbindelse. Nedenstående kode viser hvor Ruby bruges til at sende og modtage vis RS232. class Cli   attr_reader :data   def cli(command)     @@sp.write “#{command}”     lines = @@sp.readlines     @data = “”     lines.each { |line|       @data += line     }     end     self   end   def self.connect  …

Read More

Ruby Pry – Windows

Når jeg laver Ruby scripts, bruger jeg typisk Pry (binding.pry) til at debugge og steppe igennem koden. Desværre er Pry ikke en del af standard Ruby, så nedenstående pakker skal installeres ( jeg bruger pt. Windows). gem install pry gem install pry-nav gem install pry-byebug Når de er installeret, har jeg typisk en fælles fil med nedenstående kode, således at jeg kan steppe igennem koden med ‘n’, ‘c’ og ‘s’ aliases. En yderligere fordel ved at gøre det på denne måde, er at man kan køre sit script på andre…

Read More

Ruby – Timeout

Jeg bruger Ruby til, at teste mine embedded C kode, og har derfor en RS232 forbindelse til mit board. I dag havde jeg et lille problem med, at når der var en fejl i den embedded kode, og jeg lavede mine accesses fra Ruby over RS2332 porten, så hang Ruby uden at komme videre. Det betød at mine test-suite aldrig blev færdig, og jeg aldrig fik en mail om, at der var noget galt. Derfor havde jeg brug for, at Ruby lavede en break, når RS232 porten ikke kunne accesses…

Read More

Konvertering af binær data til C++ array

I dag skulle jeg lave noget kode til at lave voice prompts. Alle voice lyd filerne skal ligge som FAT16 format i en ekstern flash. Desværre er hardware’en ikke færdig endnu, så jeg har ikke den faktiske flash. For at teste mit FAT16 system bestemte jeg mig for, at havde mit “fil system” som et C array. Jeg fandt en smart hjemme-side, der kan hjælpe med netop det. Det er denne site : http://tools.garry.tv/bin2c/ Den lader dig oploade en binær fil, og auto-generer så et stk C kode, som har alle…

Read More