ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
606803 Топик полностью
shan (29.06.2015 20:19 - 20:27, просмотров: 176) ответил Nikolay801_ на в разных потоках используется файловые функции, тут косяков нет? семафоры не нужно поставить?
Поток вылетает из драйвера SPI, функция SendBuf(файл STM32F2xx.c) *buf у меня указывает на записи в статической памяти с 0х40024000. Вторая по счёту запись сбрасывает SRAM до последнего байта 0x40024fff и почему-то иногда не срабатывает останов по i<sz и происходит обращение к несуществующей памяти 0x40025000. Видимо в этот момент идут прерывания и передача другим процессам, а при восстановлении этого потока не восстанавливается состояние ядра. Циклы FOR сам не применяю, но в данном случае драйвер брал готовый из RTOS. Может ли помочь убрать описатель static? /*--------------------------- SendBuf ---------------------------------------*/ static BOOL SendBuf (U8 *buf, U32 sz) { /* Send buffer to SPI interface. */ U32 i; for (i = 0; i < sz; i++) { SPI_N->DR = buf[i]; /* Wait if TXE cleared, Tx FIFO is full. */ while (!(SPI_N->SR & TXE)); SPI_N->DR; } /* Wait until Tx finished, drain Rx FIFO. */ while (SPI_N->SR & (BSY | RXNE)) { SPI_N->DR; } return (__TRUE); } 144: static BOOL SendBuf (U8 *buf, U32 sz) { 145: /* Send buffer to SPI interface. */ 146: U32 i; 147: 0x08014730 B510 PUSH {r4,lr} 148: for (i = 0; i < sz; i++) { 0x08014732 2200 MOVS r2,#0x00 149: SPI_N->DR = buf[i]; 150: /* Wait if TXE cleared, Tx FIFO is full. */ 0x08014734 4B32 LDR r3,[pc,#200] ; @0x08014800 0x08014736 E006 B 0x08014746 0x08014738 5C84 LDRB r4,[r0,r2] 0x0801473A 819C STRH r4,[r3,#0x0C] 151: while (!(SPI_N->SR & TXE)); 0x0801473C 891C LDRH r4,[r3,#0x08] 0x0801473E 07A4 LSLS r4,r4,#30 0x08014740 D5FC BPL 0x0801473C 152: SPI_N->DR; 153: } 154: /* Wait until Tx finished, drain Rx FIFO. */ 155: while (SPI_N->SR & (BSY | RXNE)) { 0x08014742 899C LDRH r4,[r3,#0x0C] 0x08014744 1C52 ADDS r2,r2,#1 148: for (i = 0; i < sz; i++) { 149: SPI_N->DR = buf[i]; 150: /* Wait if TXE cleared, Tx FIFO is full. */ 151: while (!(SPI_N->SR & TXE)); 152: SPI_N->DR; 153: } 154: /* Wait until Tx finished, drain Rx FIFO. */ 155: while (SPI_N->SR & (BSY | RXNE)) { 0x08014746 428A CMP r2,r1 0x08014748 D3F6 BCC 0x08014738 0x0801474A E000 B 0x0801474E 156: SPI_N->DR; 157: } 0x0801474C 8998 LDRH r0,[r3,#0x0C] 155: while (SPI_N->SR & (BSY | RXNE)) { 156: SPI_N->DR; 157: } 0x0801474E 8918 LDRH r0,[r3,#0x08] 0x08014750 F0100F81 TST r0,#0x81 0x08014754 D1FA BNE 0x0801474C 158: return (__TRUE); 0x08014756 2001 MOVS r0,#0x01 159: } 160: 161: 162: /*--------------------------- RecBuf ----------------------------------------*/ 163: 0x08014758 BD10 POP {r4,pc}