Loading...
Searching...
No Matches
flashwrite.c
1/***********************************************************************************
2 * @file flashWrite.c *
3 * @author Matt Ricci *
4 * @addtogroup RTOS *
5 * *
6 * @{ *
7 ***********************************************************************************/
8
9#include "flashwrite.h"
10
11extern EventGroupHandle_t xTaskEnableGroup;
12
13/* =============================================================================== */
22void vIdle(void *argument) {
23
24 enum State *flightState = StateHandle_getHandle("FlightState").state;
25 MemBuff *mem = (MemBuff *)argument;
26
27 for (;;) {
28 // Write if a page is available in the buffer
29 if (*flightState >= LAUNCH && mem->pageReady)
30 xEventGroupSetBits(xTaskEnableGroup, GROUP_TASK_ENABLE_FLASH);
31 }
32}
33
34/* =============================================================================== */
43void vFlashBuffer(void *argument) {
44 const TickType_t timeout = portMAX_DELAY;
45 uint32_t pageAddr = 0;
46
47 Flash *flash = DeviceHandle_getHandle("Flash").device;
48 MemBuff *mem = (MemBuff *)argument;
49 uint8_t outBuff[flash->pageSize];
50
51 for (;;) {
52 // Wait for write flag to be ready, clear flag on exit
53 EventBits_t uxBits = xEventGroupWaitBits(xTaskEnableGroup, GROUP_TASK_ENABLE_FLASH, pdTRUE, pdFALSE, timeout);
54 if (uxBits & GROUP_TASK_ENABLE_FLASH) {
55 // Flush data to output buffer
56 bool success = mem->readPage(mem, outBuff);
57 if (success) {
58 taskENTER_CRITICAL();
59 // Write data to flash memory
60 flash->writePage(flash, pageAddr, outBuff);
61 pageAddr += 0x100;
62 taskEXIT_CRITICAL();
63 }
64 }
65 }
66}
67
Definition flash.h:30
DeviceType device
Enum specifier for device type.
Definition spi.h:50