Skip to content
This repository was archived by the owner on Apr 13, 2024. It is now read-only.

Commit bfac634

Browse files
Add missing volatile keyword to interrupt global variables
1 parent 30ca3a8 commit bfac634

File tree

2 files changed

+42
-39
lines changed

2 files changed

+42
-39
lines changed

src/can.c

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@
3838
//------------------------------------------------------------------------------
3939

4040
static CAN_HandleTypeDef hcan;
41-
static can_msg_t buffer[CAN_BUF_SIZE];
42-
static size_t buf_write_pos;
43-
static size_t buf_read_pos;
41+
static volatile can_msg_t buffer[CAN_BUF_SIZE];
42+
static volatile size_t buf_write_pos;
43+
static volatile size_t buf_read_pos;
4444

4545

4646
//------------------------------------------------------------------------------
@@ -136,29 +136,32 @@ void can_send(uint8_t id, can_cmd_t cmd, uint8_t *payload, uint8_t len)
136136
// Receive a CAN message
137137
bool can_receive(can_msg_t *msg)
138138
{
139-
if(buf_read_pos != buf_write_pos)
139+
HAL_NVIC_DisableIRQ(USB_LP_CAN_RX0_IRQn);
140+
141+
if(buf_read_pos == buf_write_pos)
140142
{
141-
// copy message from buffer
142-
msg->cmd = buffer[buf_read_pos].cmd;
143-
msg->id = buffer[buf_read_pos].id;
144-
memcpy(msg->payload, buffer[buf_read_pos].payload, msg->len);
145-
msg->len = buffer[buf_read_pos].len;
146-
147-
// increment read position
148-
if(buf_read_pos == (CAN_BUF_SIZE - 1))
149-
buf_read_pos = 0;
150-
else
151-
buf_read_pos++;
143+
HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn);
144+
return false;
145+
}
152146

153-
// blink status LED on activity
154-
HAL_GPIO_WritePin(STATUS_PORT, STATUS_PIN, GPIO_PIN_RESET);
155-
HAL_Delay(STATUS_BLINK_TIME);
156-
HAL_GPIO_WritePin(STATUS_PORT, STATUS_PIN, GPIO_PIN_SET);
147+
// copy message from buffer
148+
msg->cmd = buffer[buf_read_pos].cmd;
149+
msg->id = buffer[buf_read_pos].id;
150+
for(size_t i = 0; i < buffer[buf_read_pos].len; i++) msg->payload[i] = buffer[buf_read_pos].payload[i];
151+
msg->len = buffer[buf_read_pos].len;
157152

158-
return true;
159-
}
153+
// increment read position
154+
buf_read_pos++;
155+
if(buf_read_pos >= CAN_BUF_SIZE) buf_read_pos = 0;
156+
157+
HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn);
160158

161-
return false;
159+
// blink status LED on activity
160+
HAL_GPIO_WritePin(STATUS_PORT, STATUS_PIN, GPIO_PIN_RESET);
161+
HAL_Delay(STATUS_BLINK_TIME);
162+
HAL_GPIO_WritePin(STATUS_PORT, STATUS_PIN, GPIO_PIN_SET);
163+
164+
return true;
162165
}
163166

164167

@@ -169,27 +172,27 @@ bool can_receive(can_msg_t *msg)
169172
// CAN FIFO0 receive ISR
170173
void USB_LP_CAN_RX0_IRQHandler(void)
171174
{
175+
CAN_RxHeaderTypeDef msg_header;
176+
uint8_t msg_payload[8];
177+
172178
if(HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) > 0)
173179
{
174-
CAN_RxHeaderTypeDef msg_header;
175-
if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &msg_header, buffer[buf_write_pos].payload) == HAL_OK)
180+
if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &msg_header, msg_payload) == HAL_OK)
176181
{
177182
buffer[buf_write_pos].cmd = msg_header.ExtId >> 8;
178183
buffer[buf_write_pos].id = msg_header.ExtId & 0xFF;
184+
for(size_t i = 0; i < msg_header.DLC; i++) buffer[buf_write_pos].payload[i] = msg_payload[i];
179185
buffer[buf_write_pos].len = msg_header.DLC;
180186

181187
// increment write position
182-
if(buf_write_pos == (CAN_BUF_SIZE - 1))
183-
buf_write_pos = 0;
184-
else
185-
buf_write_pos++;
188+
buf_write_pos++;
189+
if(buf_write_pos >= CAN_BUF_SIZE) buf_write_pos = 0;
186190

191+
// bump read position if buffer is full
187192
if(buf_read_pos == buf_write_pos)
188193
{
189-
if(buf_read_pos == (CAN_BUF_SIZE - 1))
190-
buf_read_pos = 0;
191-
else
192-
buf_read_pos++;
194+
buf_read_pos++;
195+
if(buf_read_pos >= CAN_BUF_SIZE) buf_read_pos = 0;
193196
}
194197
}
195198
else

src/rgb_strip.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ static DMA_HandleTypeDef hdmas[RGB_NUM_STRIPS];
8181
static TIM_HandleTypeDef htims[RGB_NUM_STRIPS];
8282

8383
static uint8_t buffer[RGB_NUM_STRIPS][RGB_NUM_LEDS * BYTES_PER_LED];
84-
//static uint16_t dma_buffer[RGB_NUM_STRIPS][RESET_PULSE / PERIOD];
85-
static uint16_t dma_buffer[RGB_NUM_STRIPS][2 * 8 * BYTES_PER_LED];
86-
static rgb_strip_state_t state[RGB_NUM_STRIPS];
87-
static uint8_t led_index[RGB_NUM_STRIPS];
84+
//static volatile uint16_t dma_buffer[RGB_NUM_STRIPS][RESET_PULSE / PERIOD];
85+
static volatile uint16_t dma_buffer[RGB_NUM_STRIPS][2 * 8 * BYTES_PER_LED];
86+
static volatile rgb_strip_state_t state[RGB_NUM_STRIPS];
87+
static volatile uint8_t led_index[RGB_NUM_STRIPS];
8888

8989
static uint16_t timer_arr_period;
9090
static uint16_t timer_ccr_one;
@@ -304,7 +304,7 @@ static void update(uint8_t strip)
304304
while(state[strip] != STATE_INIT);
305305

306306
// set dma buffer to reset pulse (timer cc reg = 0)
307-
memset(dma_buffer[strip], 0, sizeof(dma_buffer[0]));
307+
for(size_t i = 0; i < (2 * 8 * BYTES_PER_LED); i++) dma_buffer[strip][i] = 0;
308308

309309
// move to start reset state and start DMA transfer
310310
state[strip] = STATE_START_RESET;
@@ -343,7 +343,7 @@ static void dma_process_halfcomplete(uint8_t strip)
343343
HAL_TIM_PWM_Stop_DMA(&htims[strip], TIM_CHANNEL_1);
344344

345345
// set dma buffer to reset pulse (timer cc reg = 0)
346-
memset(dma_buffer[strip], 0, sizeof(dma_buffer[0]));
346+
for(size_t i = 0; i < (2 * 8 * BYTES_PER_LED); i++) dma_buffer[strip][i] = 0;
347347

348348
// move to end reset state and start DMA transfer
349349
state[strip] = STATE_END_RESET;
@@ -384,7 +384,7 @@ static void dma_process_complete(uint8_t strip)
384384
HAL_TIM_PWM_Stop_DMA(&htims[strip], TIM_CHANNEL_1);
385385

386386
// set dma buffer to reset pulse (timer cc reg = 0)
387-
memset(dma_buffer[strip], 0, sizeof(dma_buffer[0]));
387+
for(size_t i = 0; i < (2 * 8 * BYTES_PER_LED); i++) dma_buffer[strip][i] = 0;
388388

389389
// move to end reset state and start DMA transfer
390390
state[strip] = STATE_END_RESET;

0 commit comments

Comments
 (0)