Поток вылетает из драйвера 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}