@@ -16,7 +16,8 @@ extern uint8_t rx_test_buffer[MAX_BUFFER_SIZE];
1616static uint32_t tx_byte_offset ;
1717static uint32_t rx_byte_offset ;
1818
19- K_SEM_DEFINE (uart_transmission_done_sem , 0 , 1 );
19+ K_SEM_DEFINE (uart_tx_done_sem , 0 , 1 );
20+ K_SEM_DEFINE (uart_rx_done_sem , 0 , 1 );
2021
2122void uart_tx_interrupt_service (const struct device * dev , uint8_t * test_pattern , size_t buffer_size ,
2223 uint32_t * tx_byte_offset )
@@ -29,8 +30,8 @@ void uart_tx_interrupt_service(const struct device *dev, uint8_t *test_pattern,
2930 * tx_byte_offset += bytes_sent ;
3031 } else {
3132 * tx_byte_offset = 0 ;
33+ k_sem_give (& uart_tx_done_sem );
3234 uart_irq_tx_disable (dev );
33- k_sem_give (& uart_transmission_done_sem );
3435 }
3536}
3637
@@ -44,6 +45,11 @@ void uart_rx_interrupt_service(const struct device *dev, uint8_t *receive_buffer
4445 uart_fifo_read (dev , receive_buffer_pointer + * rx_byte_offset , buffer_size );
4546 * rx_byte_offset += rx_data_length ;
4647 } while (rx_data_length );
48+ if (* rx_byte_offset >= buffer_size ) {
49+ * rx_byte_offset = 0 ;
50+ k_sem_give (& uart_rx_done_sem );
51+ uart_irq_rx_disable (uart_dev );
52+ }
4753}
4854
4955void uart_isr_handler (const struct device * dev , void * user_data )
@@ -63,7 +69,7 @@ void uart_isr_handler(const struct device *dev, void *user_data)
6369 }
6470}
6571
66- static void test_uart_latency (size_t buffer_size )
72+ static void test_uart_latency (size_t buffer_size , uint32_t baudrate )
6773{
6874 int err ;
6975 uint32_t tst_timer_value ;
@@ -82,17 +88,20 @@ static void test_uart_latency(size_t buffer_size)
8288 rx_byte_offset = 0 ;
8389
8490 zassert_true (buffer_size <= MAX_BUFFER_SIZE ,
85- "Given buffer size is to big, allowed max %u bytes\n" , MAX_BUFFER_SIZE );
91+ "Given buffer size is to big, allowed max %u bytes and baudrate: %u\n" ,
92+ MAX_BUFFER_SIZE );
8693
87- TC_PRINT ("UART TX latency in INTERRUPT mode test with buffer size: %u bytes\n" ,
88- buffer_size );
94+ TC_PRINT ("UART TX latency in INTERRUPT mode test with buffer size: %u bytes and baudrate: "
95+ "%u\n" ,
96+ buffer_size , baudrate );
8997
9098 set_test_pattern (& test_data );
9199 configure_test_timer (tst_timer_dev , TEST_TIMER_COUNT_TIME_LIMIT_MS );
92100 counter_reset (tst_timer_dev );
93101
94102 err = uart_config_get (uart_dev , & test_uart_config );
95103 zassert_equal (err , 0 , "Failed to get uart config" );
104+ test_uart_config .baudrate = baudrate ;
96105 err = uart_configure (uart_dev , & test_uart_config );
97106 zassert_equal (err , 0 , "UART configuration failed" );
98107 err = uart_irq_callback_set (uart_dev , uart_isr_handler );
@@ -110,23 +119,24 @@ static void test_uart_latency(size_t buffer_size)
110119
111120 dk_set_led_on (DK_LED1 );
112121 counter_start (tst_timer_dev );
113- zassert_equal (k_sem_take (& uart_transmission_done_sem , K_MSEC (TX_TIMEOUT_MS )), 0 );
122+ while (k_sem_take (& uart_tx_done_sem , K_NO_WAIT ) != 0 ) {
123+ };
114124 counter_get_value (tst_timer_dev , & tst_timer_value );
115125 counter_stop (tst_timer_dev );
116126 dk_set_led_off (DK_LED1 );
117127 timer_value_us = counter_ticks_to_us (tst_timer_dev , tst_timer_value );
118128
119- uart_irq_tx_disable (uart_dev );
120- uart_irq_rx_disable (uart_dev );
121- uart_irq_err_disable (uart_dev );
129+ while (k_sem_take (& uart_rx_done_sem , K_NO_WAIT ) != 0 ) {
130+ };
122131
132+ uart_irq_err_disable (uart_dev );
123133 check_transmitted_data (& test_data );
124134
125135 TC_PRINT ("Calculated transmission time (for %u bytes) [us]: %u\n" , buffer_size ,
126136 theoretical_transmission_time_us );
127137 TC_PRINT ("Measured transmission time (for %u bytes) [us]: %llu\n" , buffer_size ,
128138 timer_value_us );
129- TC_PRINT ("Measured - claculated time delta (for %u bytes) [us]: %llu \n" , buffer_size ,
139+ TC_PRINT ("Measured - claculated time delta (for %u bytes) [us]: %lld \n" , buffer_size ,
130140 timer_value_us - theoretical_transmission_time_us );
131141 TC_PRINT ("Maximal allowed transmission time [us]: %u\n" ,
132142 maximal_allowed_transmission_time_us );
@@ -135,12 +145,20 @@ static void test_uart_latency(size_t buffer_size)
135145 "Measured call latency is over the specified limit" );
136146}
137147
138- ZTEST (uart_latency , test_uart_latency_in_interrupt_mode )
148+ ZTEST (uart_latency , test_uart_latency_in_interrupt_mode_baud_9k6 )
149+ {
150+ test_uart_latency (10 , UART_BAUD_9k6 );
151+ test_uart_latency (128 , UART_BAUD_9k6 );
152+ test_uart_latency (1024 , UART_BAUD_9k6 );
153+ test_uart_latency (3000 , UART_BAUD_9k6 );
154+ }
155+
156+ ZTEST (uart_latency , test_uart_latency_in_interrupt_mode_baud_115k2 )
139157{
140- test_uart_latency (1 );
141- test_uart_latency (128 );
142- test_uart_latency (1024 );
143- test_uart_latency (3000 );
158+ test_uart_latency (10 , UART_BAUD_115k2 );
159+ test_uart_latency (128 , UART_BAUD_115k2 );
160+ test_uart_latency (1024 , UART_BAUD_115k2 );
161+ test_uart_latency (3000 , UART_BAUD_115k2 );
144162}
145163
146164void * test_setup (void )
0 commit comments