From febcf10911660c3a01a9511cef92d5bbca123c29 Mon Sep 17 00:00:00 2001 From: daishengdong Date: Thu, 19 Dec 2019 16:08:42 +0800 Subject: [PATCH] add kv fs component 1. a true wear-leveling kv fs for norflash, especially optimize for some onchip norflash with "write once on one single write unit" like stm32l4, a true "no earse before write" flash algorithm. 2. an "as less as possible" gc strategy, do best to save norflash's life. 3. full "power down protection" support 4. see "examples" of kv, project in "TencentOS_tiny_EVB_MX_Plus", with onchip flash and qspiflash sample. --- .../BSP/Hardware/ONCHIP_FLASH/onchip_flash.c | 78 + .../BSP/Hardware/QSPI_FLASH/hal_qspi_flash.c | 407 ++ .../BSP/Hardware/QSPI_FLASH/hal_qspi_flash.h | 23 + .../BSP/Hardware/QSPI_FLASH/qspi_flash_kv.c | 40 + .../BSP/Inc/quadspi.h | 79 + .../BSP/Inc/stm32l4xx_hal_conf.h | 2 +- .../BSP/Src/quadspi.c | 139 + .../TencentOS_tiny_STM32L431RCTx.dbgconf | 97 + .../KEIL/kv/EventRecorderStub.scvd | 9 + .../kv/RTE/_TencentOS_tiny/RTE_Components.h | 20 + .../KEIL/kv/TencentOS_tiny.uvoptx | 1252 ++++++ .../KEIL/kv/TencentOS_tiny.uvprojx | 827 ++++ .../KEIL/kv/obj/TencentOS_tiny.htm | 3389 +++++++++++++++++ .../KEIL/kv/obj/TencentOS_tiny.sct | 16 + .../KEIL/kv/startup_stm32l431xx.s | 404 ++ components/fs/kv/include/tos_kv.h | 333 ++ components/fs/kv/include/tos_kv_err.h | 52 + components/fs/kv/include/tos_kv_flash.h | 46 + components/fs/kv/tos_kv.c | 1348 +++++++ examples/kv/kv_sample.c | 105 + kernel/core/include/tos_task.h | 4 +- kernel/core/tos_mmheap.c | 12 +- kernel/core/tos_task.c | 2 +- 23 files changed, 8674 insertions(+), 10 deletions(-) create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/ONCHIP_FLASH/onchip_flash.c create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.c create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.h create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/qspi_flash_kv.c create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/quadspi.h create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/BSP/Src/quadspi.c create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/DebugConfig/TencentOS_tiny_STM32L431RCTx.dbgconf create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/EventRecorderStub.scvd create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/RTE/_TencentOS_tiny/RTE_Components.h create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvoptx create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvprojx create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.htm create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.sct create mode 100644 board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/startup_stm32l431xx.s create mode 100644 components/fs/kv/include/tos_kv.h create mode 100644 components/fs/kv/include/tos_kv_err.h create mode 100644 components/fs/kv/include/tos_kv_flash.h create mode 100644 components/fs/kv/tos_kv.c create mode 100644 examples/kv/kv_sample.c diff --git a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/ONCHIP_FLASH/onchip_flash.c b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/ONCHIP_FLASH/onchip_flash.c new file mode 100644 index 00000000..1e3327ff --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/ONCHIP_FLASH/onchip_flash.c @@ -0,0 +1,78 @@ +#include "tos_kv.h" +#include "stm32l4xx.h" + +#define ONCHIP_FLASH_ADDR_START 0x08000000 // start address for onchip flash for stm32l431RCTX +#define ONCHIP_FLASH_ADDR_MAX 0x0803FFFF // 256K flash addr for stm32l431RCTX + +#define SECTOR_SIZE 2048 // sector size for stm32l431RCTX +#define SECTOR_SIZE_LOG2 11 // 2 ^ 11 = 2048 + +#define FOR_KV_FLASH_SIZE (2 * SECTOR_SIZE) // storage for kv +#define FOR_KV_FLASH_START 0x803d000 + +int stm32l4_norflash_onchip_read(uint32_t addr, void *buf, size_t len) +{ + memcpy(buf, (void *)addr, len); + return 0; +} + +int stm32l4_norflash_onchip_write(uint32_t addr, const void *buf, size_t len) +{ + int i = 0; + uint8_t *array = (uint8_t *)buf; + HAL_StatusTypeDef hal_status; + + HAL_FLASH_Unlock(); + tos_cpu_int_disable(); + + for (i = 0; i < len; i += 8) { + hal_status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, + addr + i, + *(uint64_t *)&array[i]); + if (hal_status != HAL_OK) { + return -1; + } + } + + HAL_FLASH_Lock(); + tos_cpu_int_enable(); + + return 0; +} + +int stm32l4_norflash_onchip_erase(uint32_t addr, size_t size) +{ + uint32_t page_err = 0; + HAL_StatusTypeDef hal_status; + FLASH_EraseInitTypeDef erase_para; + + erase_para.TypeErase = FLASH_TYPEERASE_PAGES; + erase_para.Banks = FLASH_BANK_1; + erase_para.Page = addr / SECTOR_SIZE; + erase_para.NbPages = size / SECTOR_SIZE; + HAL_FLASH_Unlock(); + tos_cpu_int_disable(); + hal_status = HAL_FLASHEx_Erase(&erase_para, &page_err); + HAL_FLASH_Lock(); + tos_cpu_int_enable(); + + if (hal_status != HAL_OK) { + return -1; + } + + return 0; +} + +kv_flash_drv_t stm32l4_norflash_onchip_drv = { + .write = stm32l4_norflash_onchip_write, + .read = stm32l4_norflash_onchip_read, + .erase = stm32l4_norflash_onchip_erase, +}; + +kv_flash_prop_t stm32l4_norflash_onchip_prop = { + .sector_size_log2 = SECTOR_SIZE_LOG2, + .pgm_type = KV_FLASH_PROGRAM_TYPE_DOUBLEWORD, + .flash_start = FOR_KV_FLASH_START, + .flash_size = FOR_KV_FLASH_SIZE, +}; + diff --git a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.c b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.c new file mode 100644 index 00000000..d3f7a3a9 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.c @@ -0,0 +1,407 @@ +#include "hal_qspi_flash.h" +#include "stm32l4xx.h" + +#ifdef HAL_QSPI_MODULE_ENABLED + +#define QSPI_FLASH_PAGESIZE 256 +#define QSPI_FLASH_SECTOR 4096 +#define QSPI_FLASH_ID 0xEF4017 +#define QSPI_FLASH_TOTAL_SIZE 0x7FFFFF + +#define QSPI_FLASH_WriteEnable 0x06 +#define QSPI_FLASH_WriteDisable 0x04 +#define QSPI_FLASH_ReadStatusReg 0x05 +#define QSPI_FLASH_WriteStatusReg 0x01 +#define QSPI_FLASH_ReadData 0x03 +#define QSPI_FLASH_FastReadData 0x0B +#define QSPI_FLASH_FastReadDual 0x3B +#define QSPI_FLASH_PageProgram 0x02 +#define QSPI_FLASH_BlockErase 0xD8 +#define QSPI_FLASH_SectorErase 0x20 +#define QSPI_FLASH_ChipErase 0xC7 +#define QSPI_FLASH_PowerDown 0xB9 +#define QSPI_FLASH_ReleasePowerDown 0xAB +#define QSPI_FLASH_DeviceID 0xAB +#define QSPI_FLASH_ManufactDeviceID 0x90 +#define QSPI_FLASH_JedecDeviceID 0x9F +#define QSPI_FLASH_WIP_FLAG 0x01 +#define QSPI_FLASH_DUMMY_BYTE 0xFF + +#define CHOOSE_BIT_16 16 +#define CHOOSE_BIT_8 8 + + +#define CHECK_RET_RETURN(ret) \ + do \ + { \ + if ((ret) < 0) \ + { \ + return ret; \ + } \ + } while (0) + +extern QSPI_HandleTypeDef hqspi; + +/* This function is called by inner-HAL lib */ +static void HAL_QSPI_MspInit(QSPI_HandleTypeDef* qspiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(qspiHandle->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspInit 0 */ + + /* USER CODE END QUADSPI_MspInit 0 */ + /* QUADSPI clock enable */ + __HAL_RCC_QSPI_CLK_ENABLE(); + + /**QUADSPI GPIO Configuration + PB0 ------> QUADSPI_BK1_IO1 + PB1 ------> QUADSPI_BK1_IO0 + PB10 ------> QUADSPI_CLK + PB11 ------> QUADSPI_BK1_NCS + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN QUADSPI_MspInit 1 */ + + /* USER CODE END QUADSPI_MspInit 1 */ + } +} + +/* This function is called by inner-HAL lib */ +static void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* qspiHandle) +{ + + if(qspiHandle->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspDeInit 0 */ + + /* USER CODE END QUADSPI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_QSPI_CLK_DISABLE(); + + /**QUADSPI GPIO Configuration + PB0 ------> QUADSPI_BK1_IO1 + PB1 ------> QUADSPI_BK1_IO0 + PB10 ------> QUADSPI_CLK + PB11 ------> QUADSPI_BK1_NCS + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11); + + /* USER CODE BEGIN QUADSPI_MspDeInit 1 */ + + /* USER CODE END QUADSPI_MspDeInit 1 */ + } +} + + +/** + * @brief QSPI发送命令 + * + * @param instruction 要发送的指令 + * @param address 发送到的目的地址 + * @param dummyCycles 空指令周期数 + * @param instructionMode 指令模式;QSPI_INSTRUCTION_NONE,QSPI_INSTRUCTION_1_LINE,QSPI_INSTRUCTION_2_LINE,QSPI_INSTRUCTION_4_LINE + * @param addressMode 地址模式; QSPI_ADDRESS_NONE,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_2_LINE,QSPI_ADDRESS_4_LINE + * @param addressSize 地址长度;QSPI_ADDRESS_8_BITS,QSPI_ADDRESS_16_BITS,QSPI_ADDRESS_24_BITS,QSPI_ADDRESS_32_BITS + * @param dataMode 数据模式; QSPI_DATA_NONE,QSPI_DATA_1_LINE,QSPI_DATA_2_LINE,QSPI_DATA_4_LINE + * + * @return void + */ +uint32_t QSPI_Send_CMD(uint32_t instruction, uint32_t address, uint32_t dummyCycles, uint32_t instructionMode, uint32_t addressMode, uint32_t addressSize, uint32_t dataMode) +{ + QSPI_CommandTypeDef s_command; + + s_command.Instruction = instruction; //指令 + s_command.Address = address; //地址 + s_command.DummyCycles = dummyCycles; //设置空指令周期数 + s_command.InstructionMode = instructionMode; //指令模式 + s_command.AddressMode = addressMode; //地址模式 + s_command.AddressSize = addressSize; //地址长度 + s_command.DataMode = dataMode; //数据模式 + s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; //每次都发送指令 + s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; //无交替字节 + s_command.DdrMode = QSPI_DDR_MODE_DISABLE; //关闭DDR模式 + s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; + + return HAL_QSPI_Command(&hqspi, &s_command, 5000); +} + +uint8_t QSPI_Receive(const uint8_t * buf, uint32_t datalen) +{ + hqspi.Instance->DLR = datalen - 1; //Configuration data length + if(HAL_QSPI_Receive(&hqspi, (uint8_t * )buf, 5000) == HAL_OK) return 0; //receive data + + else return 1; +} + +uint8_t QSPI_Transmit(const int8_t * buf, uint32_t datalen) +{ + hqspi.Instance->DLR = datalen - 1; //Configuration data length + if(HAL_QSPI_Transmit(&hqspi, (uint8_t * )buf, 5000) == HAL_OK) return 0; //send data + + else return 1; +} + +static void prv_spi_flash_write_enable(void) +{ + QSPI_Send_CMD(QSPI_FLASH_WriteEnable, 0, 0, QSPI_INSTRUCTION_1_LINE, QSPI_ADDRESS_NONE, QSPI_ADDRESS_8_BITS, QSPI_DATA_NONE); +} + +static void prv_spi_flash_wait_write_end(void) +{ + uint8_t status = 0; + + + /* Loop as long as the memory is busy with a write cycle */ + do + { + /* Send a dummy byte to generate the clock needed by the FLASH + and put the value of the status register in status variable */ + QSPI_Send_CMD(QSPI_FLASH_ReadStatusReg, 0, 0, QSPI_INSTRUCTION_1_LINE, QSPI_ADDRESS_NONE, QSPI_ADDRESS_8_BITS, QSPI_DATA_1_LINE); + QSPI_Receive(&status, 1); + + } while ((status & QSPI_FLASH_WIP_FLAG) == SET); /* Write in progress */ + +} + +static int prv_spi_flash_write_page(const uint8_t* buf, uint32_t addr, int32_t len) +{ + int ret = 0; + + if(0 == len) + { + return 0; + } + + prv_spi_flash_write_enable(); //Write enable + + QSPI_Send_CMD(QSPI_FLASH_PageProgram, addr, 0, QSPI_INSTRUCTION_1_LINE, QSPI_ADDRESS_1_LINE, QSPI_ADDRESS_24_BITS, QSPI_DATA_1_LINE); + QSPI_Transmit((const int8_t *)buf, len); + + prv_spi_flash_wait_write_end(); //Waiting for Writing to End + + return ret; +} + + int prv_spi_flash_erase_sector(uint32_t addr) +{ + //printf("fe:%x\r\n",addr); //监视flash擦除情况,测试用 + int ret = 0; + prv_spi_flash_write_enable(); //Write enable + prv_spi_flash_wait_write_end(); + + ret=QSPI_Send_CMD(QSPI_FLASH_SectorErase, addr, 0, QSPI_INSTRUCTION_1_LINE, QSPI_ADDRESS_1_LINE, QSPI_ADDRESS_24_BITS, QSPI_DATA_NONE); + + prv_spi_flash_wait_write_end(); //Waiting for Writing to End + + return ret; +} + +void hal_spi_flash_config(void) +{ + hqspi.Instance = QUADSPI; + hqspi.Init.ClockPrescaler = 0; + hqspi.Init.FifoThreshold = 4; + hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE; + hqspi.Init.FlashSize = POSITION_VAL(0x1000000) - 1; + hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_4_CYCLE; + hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0; + hqspi.Init.FlashID = QSPI_FLASH_ID_1; + hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE; + if (HAL_QSPI_Init(&hqspi) != HAL_OK) + { + Error_Handler(); + } + +} + +int hal_spi_flash_erase(uint32_t addr, int32_t len) +{ + uint32_t begin; + uint32_t end; + int i; + + if (len < 0 + || addr > QSPI_FLASH_TOTAL_SIZE + || addr + len > QSPI_FLASH_TOTAL_SIZE) + { + return -1; + } + + begin = addr / QSPI_FLASH_SECTOR * QSPI_FLASH_SECTOR; + end = (addr + len - 1) / QSPI_FLASH_SECTOR * QSPI_FLASH_SECTOR; + + for (i = begin; i <= end; i += QSPI_FLASH_SECTOR) + { + if (prv_spi_flash_erase_sector(i) == -1) + { + return -1; + } + } + + return 0; +} + +int hal_spi_flash_write(const void* buf, int32_t len, uint32_t* location) +{ + const uint8_t* pbuf = (const uint8_t*)buf; + int page_cnt = 0; + int remain_cnt = 0; + int temp = 0; + uint32_t loc_addr; + uint8_t addr = 0; + uint8_t count = 0; + int i; + int ret = 0; + + if (NULL == pbuf + || NULL == location + || len < 0 + || *location > QSPI_FLASH_TOTAL_SIZE + || len + *location > QSPI_FLASH_TOTAL_SIZE) + { + return -1; + } + + loc_addr = *location; + addr = loc_addr % QSPI_FLASH_PAGESIZE; + count = QSPI_FLASH_PAGESIZE - addr; + page_cnt = len / QSPI_FLASH_PAGESIZE; + remain_cnt = len % QSPI_FLASH_PAGESIZE; + + if (addr == 0) /* addr is aligned to SPI_FLASH_PAGESIZE */ + { + if (page_cnt == 0) /* len < SPI_FLASH_PAGESIZE */ + { + ret = prv_spi_flash_write_page(pbuf, loc_addr, len); + CHECK_RET_RETURN(ret); + } + else /* len > SPI_FLASH_PAGESIZE */ + { + for (i = 0; i < page_cnt; ++i) + { + ret = prv_spi_flash_write_page(pbuf + i * QSPI_FLASH_PAGESIZE, loc_addr, QSPI_FLASH_PAGESIZE); + CHECK_RET_RETURN(ret); + loc_addr += QSPI_FLASH_PAGESIZE; + } + + ret = prv_spi_flash_write_page(pbuf + page_cnt * QSPI_FLASH_PAGESIZE, loc_addr, remain_cnt); + CHECK_RET_RETURN(ret); + } + } + else /* addr is not aligned to SPI_FLASH_PAGESIZE */ + { + if (page_cnt == 0) /* len < SPI_FLASH_PAGESIZE */ + { + if (remain_cnt > count) /* (len + loc_addr) > SPI_FLASH_PAGESIZE */ + { + temp = remain_cnt - count; + + ret = prv_spi_flash_write_page(pbuf, loc_addr, count); + CHECK_RET_RETURN(ret); + + ret = prv_spi_flash_write_page(pbuf + count, loc_addr + count, temp); + CHECK_RET_RETURN(ret); + } + else + { + ret = prv_spi_flash_write_page(pbuf, loc_addr, len); + CHECK_RET_RETURN(ret); + } + } + else /* len > SPI_FLASH_PAGESIZE */ + { + len -= count; + page_cnt = len / QSPI_FLASH_PAGESIZE; + remain_cnt = len % QSPI_FLASH_PAGESIZE; + + ret = prv_spi_flash_write_page(pbuf, loc_addr, count); + CHECK_RET_RETURN(ret); + loc_addr += count; + + for (i = 0; i < page_cnt; ++i) + { + ret = prv_spi_flash_write_page(pbuf + count + i * QSPI_FLASH_PAGESIZE, loc_addr, QSPI_FLASH_PAGESIZE); + CHECK_RET_RETURN(ret); + loc_addr += QSPI_FLASH_PAGESIZE; + } + + if (remain_cnt != 0) + { + ret = prv_spi_flash_write_page(pbuf + count + page_cnt * QSPI_FLASH_PAGESIZE, loc_addr, remain_cnt); + CHECK_RET_RETURN(ret); + } + } + } + + *location += len; + return ret; + +} + +int hal_spi_flash_erase_write(const void* buf, int32_t len, uint32_t location) +{ + int ret = 0; + + ret = hal_spi_flash_erase(location, len); + CHECK_RET_RETURN(ret); + ret = hal_spi_flash_write(buf, len, &location); + + return ret; +} + +int hal_spi_flash_read(void* buf, int32_t len, uint32_t location) +{ + int ret = 0; + uint8_t* pbuf = (uint8_t*)buf; + + if (NULL == pbuf + || len < 0 + || location > QSPI_FLASH_TOTAL_SIZE + || len + location > QSPI_FLASH_TOTAL_SIZE) + { + return -1; + } + + QSPI_Send_CMD(QSPI_FLASH_FastReadData, location, 8, QSPI_INSTRUCTION_1_LINE, QSPI_ADDRESS_1_LINE, QSPI_ADDRESS_24_BITS, QSPI_DATA_1_LINE); + QSPI_Receive(buf, len); + + return ret; + +} + +int hal_spi_flash_get_id(void) +{ + QSPI_CommandTypeDef s_command; + uint8_t temp[3]; + uint32_t deviceid; + + s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; + s_command.Instruction = QSPI_FLASH_JedecDeviceID; + s_command.AddressMode = QSPI_ADDRESS_1_LINE; + s_command.AddressSize = QSPI_ADDRESS_24_BITS; + s_command.DataMode = QSPI_DATA_1_LINE; + s_command.AddressMode = QSPI_ADDRESS_NONE; + s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; + s_command.DummyCycles = 0; + s_command.NbData = 3; + s_command.DdrMode = QSPI_DDR_MODE_DISABLE; + s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; + s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; + + HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE); + + QSPI_Receive(temp, 3); + deviceid = (temp[1]<<8)|( temp[0]<<16)|(temp[2]); + return deviceid; +} + + +#endif /* HAL_QSPI_MODULE_ENABLED */ diff --git a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.h b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.h new file mode 100644 index 00000000..9cd2639f --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/hal_qspi_flash.h @@ -0,0 +1,23 @@ +#ifndef __HAL_SPI_FLASH_H__ +#define __HAL_SPI_FLASH_H__ + +#include + +void hal_spi_flash_config(void); + +int hal_spi_flash_erase(uint32_t addr, int32_t len); + +int hal_spi_flash_write(const void* buf, int32_t len, uint32_t* location); + +int hal_spi_flash_erase_write(const void* buf, int32_t len, uint32_t location); + +int hal_spi_flash_read(void* buf, int32_t len, uint32_t location); + +int hal_spi_flash_get_id(void); + +void hal_spi_flash_power_down(void); + +void hal_spi_flash_wake_up(void); + +#endif /* _HAL_SPI_FLASH_H_ */ + diff --git a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/qspi_flash_kv.c b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/qspi_flash_kv.c new file mode 100644 index 00000000..9968c8ee --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Hardware/QSPI_FLASH/qspi_flash_kv.c @@ -0,0 +1,40 @@ +#include "tos_kv.h" +#include "hal_qspi_flash.h" + +#define SECTOR_SIZE 4096 // sector size for qspiflash +#define SECTOR_SIZE_LOG2 12 // 2 ^ 12 = 4096 + +#define FOR_KV_FLASH_SIZE (2 * SECTOR_SIZE) +#define FOR_KV_FLASH_START 0x0 + +int stm32l4_qspiflash_read(uint32_t addr, void *buf, size_t len) +{ + return hal_spi_flash_read(buf, len, addr); +} + +int stm32l4_qspiflash_write(uint32_t addr, const void *buf, size_t len) +{ + uint32_t location = addr; + + return hal_spi_flash_write(buf, len, &location); +} + +int stm32l4_qspiflash_erase(uint32_t addr, size_t size) +{ + return hal_spi_flash_erase(addr, size); +} + +kv_flash_drv_t stm32l4_qspiflash_drv = { + .write = stm32l4_qspiflash_write, + .read = stm32l4_qspiflash_read, + .erase = stm32l4_qspiflash_erase, +}; + +kv_flash_prop_t stm32l4_qspiflash_prop = { + .sector_size_log2 = SECTOR_SIZE_LOG2, + .pgm_type = KV_FLASH_PROGRAM_TYPE_BYTE, + .flash_start = FOR_KV_FLASH_START, + .flash_size = FOR_KV_FLASH_SIZE, +}; + + diff --git a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/quadspi.h b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/quadspi.h new file mode 100644 index 00000000..27e5be59 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/quadspi.h @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * File Name : QUADSPI.h + * Description : This file provides code for the configuration + * of the QUADSPI instances. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __quadspi_H +#define __quadspi_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern QSPI_HandleTypeDef hqspi; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_QUADSPI_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ quadspi_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/stm32l4xx_hal_conf.h b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/stm32l4xx_hal_conf.h index b877f4ad..8c41790a 100644 --- a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/stm32l4xx_hal_conf.h +++ b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Inc/stm32l4xx_hal_conf.h @@ -78,7 +78,7 @@ /*#define HAL_OSPI_MODULE_ENABLED */ /*#define HAL_PCD_MODULE_ENABLED */ /*#define HAL_QSPI_MODULE_ENABLED */ -/*#define HAL_QSPI_MODULE_ENABLED */ +#define HAL_QSPI_MODULE_ENABLED /*#define HAL_RNG_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED /*#define HAL_SAI_MODULE_ENABLED */ diff --git a/board/TencentOS_tiny_EVB_MX_Plus/BSP/Src/quadspi.c b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Src/quadspi.c new file mode 100644 index 00000000..9e4a004f --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/BSP/Src/quadspi.c @@ -0,0 +1,139 @@ +/** + ****************************************************************************** + * File Name : QUADSPI.c + * Description : This file provides code for the configuration + * of the QUADSPI instances. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "quadspi.h" + +#include "gpio.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +QSPI_HandleTypeDef hqspi; + +/* QUADSPI init function */ +void MX_QUADSPI_Init(void) +{ + + hqspi.Instance = QUADSPI; + hqspi.Init.ClockPrescaler = 0; + hqspi.Init.FifoThreshold = 4; + hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE; + hqspi.Init.FlashSize = 25; + hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_4_CYCLE; + hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0; + hqspi.Init.FlashID = QSPI_FLASH_ID_1; + hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE; + if (HAL_QSPI_Init(&hqspi) != HAL_OK) + { + return; + } + +} + +void HAL_QSPI_MspInit(QSPI_HandleTypeDef* qspiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(qspiHandle->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspInit 0 */ + + /* USER CODE END QUADSPI_MspInit 0 */ + /* QUADSPI clock enable */ + __HAL_RCC_QSPI_CLK_ENABLE(); + + /**QUADSPI GPIO Configuration + PB0 ------> QUADSPI_BK1_IO1 + PB1 ------> QUADSPI_BK1_IO0 + PB10 ------> QUADSPI_CLK + PB11 ------> QUADSPI_BK1_NCS + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN QUADSPI_MspInit 1 */ + + /* USER CODE END QUADSPI_MspInit 1 */ + } +} + +void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* qspiHandle) +{ + + if(qspiHandle->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspDeInit 0 */ + + /* USER CODE END QUADSPI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_QSPI_CLK_DISABLE(); + + /**QUADSPI GPIO Configuration + PB0 ------> QUADSPI_BK1_IO1 + PB1 ------> QUADSPI_BK1_IO0 + PB10 ------> QUADSPI_CLK + PB11 ------> QUADSPI_BK1_NCS + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11); + + /* USER CODE BEGIN QUADSPI_MspDeInit 1 */ + + /* USER CODE END QUADSPI_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/DebugConfig/TencentOS_tiny_STM32L431RCTx.dbgconf b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/DebugConfig/TencentOS_tiny_STM32L431RCTx.dbgconf new file mode 100644 index 00000000..c9811753 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/DebugConfig/TencentOS_tiny_STM32L431RCTx.dbgconf @@ -0,0 +1,97 @@ +// File: STM32L43x_44x_45x_46x.dbgconf +// Version: 1.0.0 +// Note: refer to STM32L43xxx STM32L44xxx STM32L45xxx STM32L46xxx Reference manual (RM0394) +// refer to STM32L431xx, STM32L432xx, STM32L433xx, STM32L442xx, STM32L443xx, STM32L451xx, STM32L452xx, STM32L462xx datasheets + +// <<< Use Configuration Wizard in Context Menu >>> + +// Debug MCU configuration register (DBGMCU_CR) +// DBG_STANDBY +// Debug Standby mode +// 0: (FCLK=Off, HCLK=Off) The whole digital part is unpowered. +// 1: (FCLK=On, HCLK=On) The digital part is not unpowered and FCLK and HCLK are provided by the internal RC oscillator which remains active +// DBG_STOP +// Debug Stop mode +// 0: (FCLK=Off, HCLK=Off) In STOP mode, the clock controller disables all clocks (including HCLK and FCLK). +// 1: (FCLK=On, HCLK=On) When entering STOP mode, FCLK and HCLK are provided by the internal RC oscillator which remains active in STOP mode. +// DBG_SLEEP +// Debug Sleep mode +// 0: (FCLK=On, HCLK=Off) In Sleep mode, FCLK is clocked by the system clock as previously configured by the software while HCLK is disabled. +// 1: (FCLK=On, HCLK=On) When entering Sleep mode, HCLK is fed by the same clock that is provided to FCLK (system clock as previously configured by the software). +// +DbgMCU_CR = 0x00000007; + +// Debug MCU APB1 freeze register1 (DBGMCU_APB1FZR1) +// DBG_LPTIM1_STOP +// LPTIM1 counter stopped when core is halted +// 0: The counter clock of LPTIM1 is fed even if the core is halted +// 1: The counter clock of LPTIM1 is stopped when the core is halted +// DBG_CAN_STOP +// bxCAN1 stopped when core is halted +// 0: Same behavior as in normal mode +// 1: The bxCAN1 receive registers are frozen +// DBG_I2C3_STOP +// I2C3 SMBUS timeout counter stopped when core is halted +// 0: Same behavior as in normal mode +// 1: The I2C3 SMBus timeout is frozen +// DBG_I2C2_STOP +// I2C2 SMBUS timeout counter stopped when core is halted +// 0: Same behavior as in normal mode +// 1: The I2C2 SMBus timeout is frozen +// DBG_I2C1_STOP +// I2C1 SMBUS timeout counter stopped when core is halted +// 0: Same behavior as in normal mode +// 1: The I2C1 SMBus timeout is frozen +// DBG_IWDG_STOP +// Independent watchdog counter stopped when core is halted +// 0: The independent watchdog counter clock continues even if the core is halted +// 1: The independent watchdog counter clock is stopped when the core is halted +// DBG_WWDG_STOP +// Window watchdog counter stopped when core is halted +// 0: The window watchdog counter clock continues even if the core is halted +// 1: The window watchdog counter clock is stopped when the core is halted +// DBG_RTC_STOP +// RTC counter stopped when core is halted +// 0: The clock of the RTC counter is fed even if the core is halted +// 1: The clock of the RTC counter is stopped when the core is halted +// DBG_TIM7_STOP +// TIM7 counter stopped when core is halted +// 0: The counter clock of TIM7 is fed even if the core is halted +// 1: The counter clock of TIM7 is stopped when the core is halted +// DBG_TIM6_STOP +// TIM6 counter stopped when core is halted +// 0: The counter clock of TIM6 is fed even if the core is halted +// 1: The counter clock of TIM6 is stopped when the core is halted +// DBG_TIM2_STOP +// TIM2 counter stopped when core is halted +// 0: The counter clock of TIM2 is fed even if the core is halted +// 1: The counter clock of TIM2 is stopped when the core is halted +// +DbgMCU_APB1_Fz1 = 0x00000000; + +// Debug MCU APB1 freeze register 2 (DBGMCU_APB1FZR2) +// DBG_LPTIM2_STOP +// LPTIM2 counter stopped when core is halted +// 0: The counter clock of LPTIM2 is fed even if the core is halted +// 1: The counter clock of LPTIM2 is stopped when the core is halted +// +DbgMCU_APB1_Fz2 = 0x00000000; + +// Debug MCU APB2 freeze register (DBGMCU_APB2FZR) +// DBG_TIM16_STOP +// TIM16 counter stopped when core is halted +// 0: The clock of the TIM16 counter is fed even if the core is halted +// 1: The clock of the TIM16 counter is stopped when the core is halted +// DBG_TIM15_STOP +// TIM15 counter stopped when core is halted +// 0: The clock of the TIM15 counter is fed even if the core is halted +// 1: The clock of the TIM15 counter is stopped when the core is halted +// DBG_TIM1_STOP +// TIM1 counter stopped when core is halted +// 0: The clock of the TIM1 counter is fed even if the core is halted +// 1: The clock of the TIM1 counter is stopped when the core is halted +// +DbgMCU_APB2_Fz = 0x00000000; +// + +// <<< end of configuration section >>> \ No newline at end of file diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/EventRecorderStub.scvd b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/EventRecorderStub.scvd new file mode 100644 index 00000000..2956b296 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/EventRecorderStub.scvd @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/RTE/_TencentOS_tiny/RTE_Components.h b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/RTE/_TencentOS_tiny/RTE_Components.h new file mode 100644 index 00000000..45b7722b --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/RTE/_TencentOS_tiny/RTE_Components.h @@ -0,0 +1,20 @@ + +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: 'TencentOS_tiny' + * Target: 'TencentOS_tiny' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +/* + * Define the Device Header File: + */ +#define CMSIS_device_header "stm32l4xx.h" + + +#endif /* RTE_COMPONENTS_H */ diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvoptx b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvoptx new file mode 100644 index 00000000..6257b01e --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvoptx @@ -0,0 +1,1252 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + TencentOS_tiny + 0x4 + ARM-ADS + + 80000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\list\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM)) + + + 0 + ST-LINKIII-KEIL_SWO + -U303030303030303030303031 -O10446 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256.FLM -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM) + + + + + 0 + 0 + 1037 + 1 +
134238752
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\..\components\fs\kv\tos_kv.c + + \\TencentOS_tiny\../../../../components/fs/kv/tos_kv.c\1037 +
+ + 1 + 0 + 770 + 1 +
134234982
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\..\components\fs\kv\tos_kv.c + + \\TencentOS_tiny\../../../../components/fs/kv/tos_kv.c\770 +
+
+ + + 0 + 1 + item_hdr + + + + + 1 + 0 + 0x803d000 + 0 + + + + + 2 + 0 + 0x803d000 + 2048 + 0 + + + + + 3 + 0 + 0x803d000 + 2048 * 2 + 0 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + +
+
+ + + Application/MDK-ARM + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + startup_stm32l431xx.s + startup_stm32l431xx.s + 0 + 0 + + + + + Application/User + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\gpio.c + gpio.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\main.c + main.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\mcu_init.c + mcu_init.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\stm32l4xx_hal_msp.c + stm32l4xx_hal_msp.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\stm32l4xx_it.c + stm32l4xx_it.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\usart.c + usart.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\adc.c + adc.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\dac.c + dac.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\i2c.c + i2c.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\spi.c + spi.c + 0 + 0 + + + 2 + 12 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\quadspi.c + quadspi.c + 0 + 0 + + + + + examples + 0 + 0 + 0 + 0 + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\examples\kv\kv_sample.c + kv_sample.c + 0 + 0 + + + + + Drivers/STM32L4xx_HAL_Driver + 0 + 0 + 0 + 0 + + 4 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c + stm32l4xx_hal_tim.c + 0 + 0 + + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c + stm32l4xx_hal_tim_ex.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + stm32l4xx_hal_uart.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + stm32l4xx_hal_uart_ex.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + stm32l4xx_hal.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c + stm32l4xx_hal_i2c.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c + stm32l4xx_hal_i2c_ex.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + stm32l4xx_hal_rcc.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + stm32l4xx_hal_rcc_ex.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c + stm32l4xx_hal_flash.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c + stm32l4xx_hal_flash_ex.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c + stm32l4xx_hal_flash_ramfunc.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + stm32l4xx_hal_gpio.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + stm32l4xx_hal_dma.c + 0 + 0 + + + 4 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + stm32l4xx_hal_dma_ex.c + 0 + 0 + + + 4 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + stm32l4xx_hal_pwr.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + stm32l4xx_hal_pwr_ex.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + stm32l4xx_hal_cortex.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c + stm32l4xx_hal_adc_ex.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c + stm32l4xx_hal_adc.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c + stm32l4xx_hal_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c + stm32l4xx_hal_dac_ex.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c + stm32l4xx_hal_spi.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c + stm32l4xx_hal_spi_ex.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_qspi.c + stm32l4xx_hal_qspi.c + 0 + 0 + + + + + Drivers/CMSIS + 0 + 0 + 0 + 0 + + 5 + 39 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\system_stm32l4xx.c + system_stm32l4xx.c + 0 + 0 + + + + + Hardware + 0 + 0 + 0 + 0 + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\ONCHIP_FLASH\onchip_flash.c + onchip_flash.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\QSPI_FLASH\hal_qspi_flash.c + hal_qspi_flash.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\DHT11\DHT11_BUS.c + DHT11_BUS.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\OLED\oled.c + oled.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\QSPI_FLASH\qspi_flash_kv.c + qspi_flash_kv.c + 0 + 0 + + + + + kernel + 0 + 0 + 0 + 0 + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_binary_heap.c + tos_binary_heap.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_char_fifo.c + tos_char_fifo.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_completion.c + tos_completion.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_countdownlatch.c + tos_countdownlatch.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_event.c + tos_event.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_global.c + tos_global.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mail_queue.c + tos_mail_queue.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_message_queue.c + tos_message_queue.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mmblk.c + tos_mmblk.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mmheap.c + tos_mmheap.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mutex.c + tos_mutex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_pend.c + tos_pend.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_mail_queue.c + tos_priority_mail_queue.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_message_queue.c + tos_priority_message_queue.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_queue.c + tos_priority_queue.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_ring_queue.c + tos_ring_queue.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_robin.c + tos_robin.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sched.c + tos_sched.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sem.c + tos_sem.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sys.c + tos_sys.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_task.c + tos_task.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_tick.c + tos_tick.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_time.c + tos_time.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_timer.c + tos_timer.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 8 + 69 + 2 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S + port_s.S + 0 + 0 + + + 8 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + tos_cpu.c + 0 + 0 + + + 8 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_c.c + port_c.c + 0 + 0 + + + + + cmsis + 0 + 0 + 0 + 0 + + 9 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\osal\cmsis_os\cmsis_os.c + cmsis_os.c + 0 + 0 + + + + + config + 0 + 0 + 0 + 0 + + 10 + 73 + 5 + 0 + 0 + 0 + ..\..\TOS-CONFIG\tos_config.h + tos_config.h + 0 + 0 + + + + + kv + 0 + 0 + 0 + 0 + + 11 + 74 + 1 + 0 + 0 + 0 + ..\..\..\..\components\fs\kv\tos_kv.c + tos_kv.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvprojx b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvprojx new file mode 100644 index 00000000..91f4f1c5 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/TencentOS_tiny.uvprojx @@ -0,0 +1,827 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + TencentOS_tiny + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L431RCTx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4") + + + + + + + + + + + + + + + $$Device:STM32L431RCTx$CMSIS\SVD\STM32L4x1.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\obj\ + TencentOS_tiny + 1 + 0 + 1 + 1 + 0 + .\list\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4107 + + 1 + STLink\ST-LINKIII-KEIL_SWO.dll + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER,STM32L431xx,WITH_TOS_NET_ADAPTER,USE_ESP8266 + + ..\..\BSP\Inc;..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32L4xx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\kernel\core\include;..\..\TOS-CONFIG;..\..\..\..\platform\arch\arm\cortex-m4\keil;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;..\..\BSP\Hardware\DHT11;..\..\BSP\Hardware\OLED;..\..\BSP\Hardware\BH1750;..\..\..\..\components\fs\kv\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Application/MDK-ARM + + + startup_stm32l431xx.s + 2 + startup_stm32l431xx.s + + + + + Application/User + + + gpio.c + 1 + ..\..\BSP\Src\gpio.c + + + main.c + 1 + ..\..\BSP\Src\main.c + + + mcu_init.c + 1 + ..\..\BSP\Src\mcu_init.c + + + stm32l4xx_hal_msp.c + 1 + ..\..\BSP\Src\stm32l4xx_hal_msp.c + + + stm32l4xx_it.c + 1 + ..\..\BSP\Src\stm32l4xx_it.c + + + usart.c + 1 + ..\..\BSP\Src\usart.c + + + adc.c + 1 + ..\..\BSP\Src\adc.c + + + dac.c + 1 + ..\..\BSP\Src\dac.c + + + i2c.c + 1 + ..\..\BSP\Src\i2c.c + + + spi.c + 1 + ..\..\BSP\Src\spi.c + + + quadspi.c + 1 + ..\..\BSP\Src\quadspi.c + + + + + examples + + + kv_sample.c + 1 + ..\..\..\..\examples\kv\kv_sample.c + + + + + Drivers/STM32L4xx_HAL_Driver + + + stm32l4xx_hal_tim.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c + + + stm32l4xx_hal_tim_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c + + + stm32l4xx_hal_uart.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + stm32l4xx_hal_uart_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + stm32l4xx_hal.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + stm32l4xx_hal_i2c.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c + + + stm32l4xx_hal_i2c_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c + + + stm32l4xx_hal_rcc.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + stm32l4xx_hal_rcc_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + stm32l4xx_hal_flash.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c + + + stm32l4xx_hal_flash_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c + + + stm32l4xx_hal_flash_ramfunc.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c + + + stm32l4xx_hal_gpio.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + stm32l4xx_hal_dma.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + stm32l4xx_hal_dma_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + stm32l4xx_hal_pwr.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + stm32l4xx_hal_pwr_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + stm32l4xx_hal_cortex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + stm32l4xx_hal_adc_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c + + + stm32l4xx_hal_adc.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c + + + stm32l4xx_hal_dac.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c + + + stm32l4xx_hal_dac_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c + + + stm32l4xx_hal_spi.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c + + + stm32l4xx_hal_spi_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c + + + stm32l4xx_hal_qspi.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_qspi.c + + + + + Drivers/CMSIS + + + system_stm32l4xx.c + 1 + ..\..\BSP\Src\system_stm32l4xx.c + + + + + Hardware + + + onchip_flash.c + 1 + ..\..\BSP\Hardware\ONCHIP_FLASH\onchip_flash.c + + + hal_qspi_flash.c + 1 + ..\..\BSP\Hardware\QSPI_FLASH\hal_qspi_flash.c + + + DHT11_BUS.c + 1 + ..\..\BSP\Hardware\DHT11\DHT11_BUS.c + + + oled.c + 1 + ..\..\BSP\Hardware\OLED\oled.c + + + qspi_flash_kv.c + 1 + ..\..\BSP\Hardware\QSPI_FLASH\qspi_flash_kv.c + + + + + kernel + + + tos_binary_heap.c + 1 + ..\..\..\..\kernel\core\tos_binary_heap.c + + + tos_char_fifo.c + 1 + ..\..\..\..\kernel\core\tos_char_fifo.c + + + tos_completion.c + 1 + ..\..\..\..\kernel\core\tos_completion.c + + + tos_countdownlatch.c + 1 + ..\..\..\..\kernel\core\tos_countdownlatch.c + + + tos_event.c + 1 + ..\..\..\..\kernel\core\tos_event.c + + + tos_global.c + 1 + ..\..\..\..\kernel\core\tos_global.c + + + tos_mail_queue.c + 1 + ..\..\..\..\kernel\core\tos_mail_queue.c + + + tos_message_queue.c + 1 + ..\..\..\..\kernel\core\tos_message_queue.c + + + tos_mmblk.c + 1 + ..\..\..\..\kernel\core\tos_mmblk.c + + + tos_mmheap.c + 1 + ..\..\..\..\kernel\core\tos_mmheap.c + + + tos_mutex.c + 1 + ..\..\..\..\kernel\core\tos_mutex.c + + + tos_pend.c + 1 + ..\..\..\..\kernel\core\tos_pend.c + + + tos_priority_mail_queue.c + 1 + ..\..\..\..\kernel\core\tos_priority_mail_queue.c + + + tos_priority_message_queue.c + 1 + ..\..\..\..\kernel\core\tos_priority_message_queue.c + + + tos_priority_queue.c + 1 + ..\..\..\..\kernel\core\tos_priority_queue.c + + + tos_ring_queue.c + 1 + ..\..\..\..\kernel\core\tos_ring_queue.c + + + tos_robin.c + 1 + ..\..\..\..\kernel\core\tos_robin.c + + + tos_sched.c + 1 + ..\..\..\..\kernel\core\tos_sched.c + + + tos_sem.c + 1 + ..\..\..\..\kernel\core\tos_sem.c + + + tos_sys.c + 1 + ..\..\..\..\kernel\core\tos_sys.c + + + tos_task.c + 1 + ..\..\..\..\kernel\core\tos_task.c + + + tos_tick.c + 1 + ..\..\..\..\kernel\core\tos_tick.c + + + tos_time.c + 1 + ..\..\..\..\kernel\core\tos_time.c + + + tos_timer.c + 1 + ..\..\..\..\kernel\core\tos_timer.c + + + + + cpu + + + port_s.S + 2 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S + + + tos_cpu.c + 1 + ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + + + port_c.c + 1 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_c.c + + + + + cmsis + + + cmsis_os.c + 1 + ..\..\..\..\osal\cmsis_os\cmsis_os.c + + + + + config + + + tos_config.h + 5 + ..\..\TOS-CONFIG\tos_config.h + + + + + kv + + + tos_kv.c + 1 + ..\..\..\..\components\fs\kv\tos_kv.c + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + +
diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.htm b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.htm new file mode 100644 index 00000000..654fb924 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.htm @@ -0,0 +1,3389 @@ + + +Static Call Graph - [.\obj\TencentOS_tiny.axf] +
+

Static Call Graph for image .\obj\TencentOS_tiny.axf


+

#<CALLGRAPH># ARM Linker, 5060750: Last Updated: Thu Dec 19 15:57:53 2019 +

+

Maximum Stack Usage = 392 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)

+Call chain for Maximum Stack Depth:

+task ⇒ tos_kv_set ⇒ kv_item_update ⇒ kv_item_save ⇒ kv_blk_search_suitable ⇒ kv_gc ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +

+

+Functions with no stack information +

+ +

+

+Mutually Recursive functions +

  • ADC1_IRQHandler   ⇒   ADC1_IRQHandler
    + +

    +

    +Function Pointers +

      +
    • ADC1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • BusFault_Handler from stm32l4xx_it.o(i.BusFault_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • CAN1_RX0_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • CAN1_RX1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • CAN1_SCE_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • CAN1_TX_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • COMP_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • CRS_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA1_Channel1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA1_Channel2_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA1_Channel3_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA1_Channel4_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA1_Channel5_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA1_Channel6_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA1_Channel7_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA2_Channel1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA2_Channel2_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA2_Channel3_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA2_Channel4_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA2_Channel5_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA2_Channel6_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DMA2_Channel7_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • DebugMon_Handler from stm32l4xx_it.o(i.DebugMon_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • EXTI0_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • EXTI15_10_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • EXTI1_IRQHandler from stm32l4xx_it.o(i.EXTI1_IRQHandler) referenced from startup_stm32l431xx.o(RESET) +
    • EXTI2_IRQHandler from stm32l4xx_it.o(i.EXTI2_IRQHandler) referenced from startup_stm32l431xx.o(RESET) +
    • EXTI3_IRQHandler from stm32l4xx_it.o(i.EXTI3_IRQHandler) referenced from startup_stm32l431xx.o(RESET) +
    • EXTI4_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • EXTI9_5_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • FLASH_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • FPU_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • HardFault_Handler from stm32l4xx_it.o(i.HardFault_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • I2C1_ER_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • I2C1_EV_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • I2C2_ER_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • I2C2_EV_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • I2C3_ER_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • I2C3_EV_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • LPTIM1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • LPTIM2_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • LPUART1_IRQHandler from stm32l4xx_it.o(i.LPUART1_IRQHandler) referenced from startup_stm32l431xx.o(RESET) +
    • MemManage_Handler from stm32l4xx_it.o(i.MemManage_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • NMI_Handler from stm32l4xx_it.o(i.NMI_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • PVD_PVM_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • PendSV_Handler from port_s.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • QUADSPI_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • RCC_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • RNG_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • RTC_Alarm_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • RTC_WKUP_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • Reset_Handler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • SAI1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • SDMMC1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • SPI1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • SPI2_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • SPI3_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • SVC_Handler from stm32l4xx_it.o(i.SVC_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • SWPMI1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • SysTick_Handler from stm32l4xx_it.o(i.SysTick_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • SystemInit from system_stm32l4xx.o(i.SystemInit) referenced from startup_stm32l431xx.o(.text) +
    • TAMP_STAMP_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TIM1_BRK_TIM15_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TIM1_CC_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TIM1_TRG_COM_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TIM1_UP_TIM16_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TIM2_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TIM6_DAC_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TIM7_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • TSC_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • UART_DMAAbortOnError from stm32l4xx_hal_uart.o(i.UART_DMAAbortOnError) referenced from stm32l4xx_hal_uart.o(i.HAL_UART_IRQHandler) +
    • USART1_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • USART2_IRQHandler from stm32l4xx_it.o(i.USART2_IRQHandler) referenced from startup_stm32l431xx.o(RESET) +
    • USART3_IRQHandler from stm32l4xx_it.o(i.USART3_IRQHandler) referenced from startup_stm32l431xx.o(RESET) +
    • UsageFault_Handler from stm32l4xx_it.o(i.UsageFault_Handler) referenced from startup_stm32l431xx.o(RESET) +
    • WWDG_IRQHandler from startup_stm32l431xx.o(.text) referenced from startup_stm32l431xx.o(RESET) +
    • __main from entry.o(.ARM.Collect$$$$00000000) referenced from startup_stm32l431xx.o(.text) +
    • application_entry from kv_sample.o(i.application_entry) referenced from main.o(.constdata) +
    • fputc from mcu_init.o(i.fputc) referenced from printf5.o(i.__0printf$5) +
    • knl_idle_entry from tos_sys.o(i.knl_idle_entry) referenced from tos_sys.o(i.knl_idle_init) +
    • kv_item_do_fetch from tos_kv.o(i.kv_item_do_fetch) referenced from tos_kv.o(i.kv_item_do_find) +
    • kv_item_do_fetch_new_copy from tos_kv.o(i.kv_item_do_fetch_new_copy) referenced from tos_kv.o(i.kv_item_do_find_new_copy) +
    • kv_item_do_gc from tos_kv.o(i.kv_item_do_gc) referenced from tos_kv.o(i.kv_do_gc) +
    • kv_item_do_recovery from tos_kv.o(i.kv_item_do_recovery) referenced from tos_kv.o(i.kv_mgr_index_build) +
    • main from main.o(i.main) referenced from entry9a.o(.ARM.Collect$$$$0000000B) +
    • stm32l4_qspiflash_erase from qspi_flash_kv.o(i.stm32l4_qspiflash_erase) referenced 2 times from qspi_flash_kv.o(.data) +
    • stm32l4_qspiflash_read from qspi_flash_kv.o(i.stm32l4_qspiflash_read) referenced 2 times from qspi_flash_kv.o(.data) +
    • stm32l4_qspiflash_write from qspi_flash_kv.o(i.stm32l4_qspiflash_write) referenced 2 times from qspi_flash_kv.o(.data) +
    • task from kv_sample.o(i.task) referenced from kv_sample.o(.constdata) +
    • task_exit from tos_task.o(i.task_exit) referenced from tos_task.o(i.tos_task_create) +
    +

    +

    +Global Symbols +

    +

    __main (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(.text) +
    +

    _main_stk (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001)) + +

    _main_scatterload (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004)) +

    [Calls]

    • >>   __scatterload +
    + +

    __main_after_scatterload (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004)) +

    [Called By]

    • >>   __scatterload +
    + +

    _main_clock (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008)) + +

    _main_cpp_init (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A)) + +

    _main_init (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B)) + +

    __rt_final_cpp (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D)) + +

    __rt_final_exit (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F)) + +

    Reset_Handler (Thumb, 8 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    ADC1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +

    [Calls]

    • >>   ADC1_IRQHandler +
    +
    [Called By]
    • >>   ADC1_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    CAN1_RX0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    CAN1_RX1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    CAN1_SCE_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    CAN1_TX_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    COMP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    CRS_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA1_Channel1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA1_Channel2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA1_Channel3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA1_Channel4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA1_Channel5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA1_Channel6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA1_Channel7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA2_Channel1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA2_Channel2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA2_Channel3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA2_Channel4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA2_Channel5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA2_Channel6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DMA2_Channel7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    EXTI0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    EXTI15_10_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    EXTI4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    EXTI9_5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    FLASH_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    FPU_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    I2C1_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    I2C1_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    I2C2_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    I2C2_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    I2C3_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    I2C3_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    LPTIM1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    LPTIM2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    PVD_PVM_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    QUADSPI_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    RCC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    RNG_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    RTC_Alarm_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    RTC_WKUP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    SAI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    SDMMC1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    SPI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    SPI2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    SPI3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    SWPMI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TAMP_STAMP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TIM1_BRK_TIM15_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TIM1_CC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TIM1_TRG_COM_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TIM1_UP_TIM16_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TIM2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TIM6_DAC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TIM7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    TSC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    USART1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    WWDG_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32l431xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    port_int_disable (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text), UNUSED) + +

    port_int_enable (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text), UNUSED) + +

    port_cpsr_save (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text)) +

    [Called By]

    • >>   tos_cpu_cpsr_save +
    + +

    port_cpsr_restore (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text)) +

    [Called By]

    • >>   tos_cpu_cpsr_restore +
    + +

    port_clz (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text)) +

    [Called By]

    • >>   tos_cpu_clz +
    + +

    port_sched_start (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text)) +

    [Called By]

    • >>   cpu_sched_start +
    + +

    port_context_switch (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text)) +

    [Called By]

    • >>   cpu_context_switch +
    + +

    port_irq_context_switch (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text)) +

    [Called By]

    • >>   cpu_irq_context_switch +
    + +

    PendSV_Handler (Thumb, 0 bytes, Stack size unknown bytes, port_s.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    __aeabi_uldivmod (Thumb, 98 bytes, Stack size 40 bytes, uldiv.o(.text)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = __aeabi_uldivmod +
    +
    [Calls]
    • >>   __aeabi_llsr +
    • >>   __aeabi_llsl +
    +
    [Called By]
    • >>   UART_SetConfig +
    • >>   cpu_init +
    • >>   _printf_core +
    + +

    __aeabi_memcpy (Thumb, 36 bytes, Stack size 0 bytes, memcpya.o(.text)) +

    [Called By]

    • >>   tos_kv_get +
    • >>   kv_item_do_save +
    + +

    __aeabi_memcpy4 (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED) + +

    __aeabi_memcpy8 (Thumb, 0 bytes, Stack size 0 bytes, memcpya.o(.text), UNUSED) + +

    __aeabi_memset (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text)) +

    [Called By]

    • >>   _memset$wrapper +
    • >>   __aeabi_memclr +
    + +

    __aeabi_memset4 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) + +

    __aeabi_memset8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) + +

    __aeabi_memclr (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text)) +

    [Calls]

    • >>   __aeabi_memset +
    +
    [Called By]
    • >>   kv_item_do_save +
    + +

    __aeabi_memclr4 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text)) +

    [Called By]

    • >>   HAL_UART_MspInit +
    • >>   SystemClock_Config +
    • >>   MX_GPIO_Init +
    • >>   tos_kv_init +
    • >>   kv_mgr_ctl_init +
    + +

    __aeabi_memclr8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) + +

    _memset$wrapper (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED) +

    [Calls]

    • >>   __aeabi_memset +
    + +

    strlen (Thumb, 14 bytes, Stack size 0 bytes, strlen.o(.text)) +

    [Called By]

    • >>   tos_kv_set +
    • >>   tos_kv_has_key +
    • >>   tos_kv_get +
    • >>   tos_kv_del +
    • >>   kv_item_save +
    • >>   kv_item_do_save +
    • >>   kv_item_do_fetch +
    + +

    memcmp (Thumb, 26 bytes, Stack size 12 bytes, memcmp.o(.text)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = memcmp +
    +
    [Called By]
    • >>   kv_item_value_is_match +
    • >>   kv_item_try_delete +
    • >>   kv_item_is_moved +
    • >>   kv_item_do_fetch_new_copy +
    • >>   kv_item_do_fetch +
    + +

    __aeabi_llsl (Thumb, 30 bytes, Stack size 0 bytes, llshl.o(.text)) +

    [Called By]

    • >>   __aeabi_uldivmod +
    + +

    _ll_shift_l (Thumb, 0 bytes, Stack size 0 bytes, llshl.o(.text), UNUSED) + +

    __aeabi_llsr (Thumb, 32 bytes, Stack size 0 bytes, llushr.o(.text)) +

    [Called By]

    • >>   __aeabi_uldivmod +
    + +

    _ll_ushift_r (Thumb, 0 bytes, Stack size 0 bytes, llushr.o(.text), UNUSED) + +

    __scatterload (Thumb, 28 bytes, Stack size 0 bytes, init.o(.text)) +

    [Calls]

    • >>   __main_after_scatterload +
    +
    [Called By]
    • >>   _main_scatterload +
    + +

    __scatterload_rt2 (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED) + +

    __decompress (Thumb, 0 bytes, Stack size unknown bytes, __dczerorl2.o(.text), UNUSED) + +

    __decompress1 (Thumb, 86 bytes, Stack size unknown bytes, __dczerorl2.o(.text), UNUSED) + +

    BusFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32l4xx_it.o(i.BusFault_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    DHT11_Init (Thumb, 48 bytes, Stack size 8 bytes, dht11_bus.o(i.DHT11_Init)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = DHT11_Init ⇒ DHT11_Mode_Out_PP ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_GPIO_WritePin +
    • >>   DHT11_Mode_Out_PP +
    +
    [Called By]
    • >>   board_init +
    + +

    DebugMon_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32l4xx_it.o(i.DebugMon_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    EXTI1_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32l4xx_it.o(i.EXTI1_IRQHandler)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = EXTI1_IRQHandler ⇒ HAL_GPIO_EXTI_IRQHandler +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    EXTI2_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32l4xx_it.o(i.EXTI2_IRQHandler)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = EXTI2_IRQHandler ⇒ HAL_GPIO_EXTI_IRQHandler +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    EXTI3_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32l4xx_it.o(i.EXTI3_IRQHandler)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = EXTI3_IRQHandler ⇒ HAL_GPIO_EXTI_IRQHandler +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    Error_Handler (Thumb, 2 bytes, Stack size 0 bytes, mcu_init.o(i.Error_Handler)) +

    [Called By]

    • >>   MX_USART3_UART_Init +
    • >>   MX_USART2_UART_Init +
    • >>   SystemClock_Config +
    + +

    HAL_DMA_Abort_IT (Thumb, 92 bytes, Stack size 16 bytes, stm32l4xx_hal_dma.o(i.HAL_DMA_Abort_IT)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = HAL_DMA_Abort_IT +
    +
    [Called By]
    • >>   HAL_UART_IRQHandler +
    + +

    HAL_Delay (Thumb, 32 bytes, Stack size 16 bytes, stm32l4xx_hal.o(i.HAL_Delay)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = HAL_Delay +
    +
    [Calls]
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   OLED_Init +
    + +

    HAL_GPIO_EXTI_Callback (Thumb, 2 bytes, Stack size 0 bytes, stm32l4xx_hal_gpio.o(i.HAL_GPIO_EXTI_Callback)) +

    [Called By]

    • >>   HAL_GPIO_EXTI_IRQHandler +
    + +

    HAL_GPIO_EXTI_IRQHandler (Thumb, 24 bytes, Stack size 8 bytes, stm32l4xx_hal_gpio.o(i.HAL_GPIO_EXTI_IRQHandler)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_GPIO_EXTI_IRQHandler +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_Callback +
    +
    [Called By]
    • >>   EXTI3_IRQHandler +
    • >>   EXTI2_IRQHandler +
    • >>   EXTI1_IRQHandler +
    + +

    HAL_GPIO_Init (Thumb, 428 bytes, Stack size 20 bytes, stm32l4xx_hal_gpio.o(i.HAL_GPIO_Init)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = HAL_GPIO_Init +
    +
    [Called By]
    • >>   HAL_UART_MspInit +
    • >>   MX_GPIO_Init +
    • >>   HAL_QSPI_MspInit +
    • >>   DHT11_Mode_Out_PP +
    + +

    HAL_GPIO_WritePin (Thumb, 10 bytes, Stack size 0 bytes, stm32l4xx_hal_gpio.o(i.HAL_GPIO_WritePin)) +

    [Called By]

    • >>   DHT11_Init +
    • >>   MX_GPIO_Init +
    • >>   Write_IIC_Byte +
    • >>   IIC_Wait_Ack +
    • >>   IIC_Stop +
    • >>   IIC_Start +
    + +

    HAL_GetTick (Thumb, 6 bytes, Stack size 0 bytes, stm32l4xx_hal.o(i.HAL_GetTick)) +

    [Called By]

    • >>   HAL_UART_Transmit +
    • >>   HAL_RCC_OscConfig +
    • >>   HAL_RCC_ClockConfig +
    • >>   HAL_RCCEx_PeriphCLKConfig +
    • >>   HAL_Delay +
    • >>   HAL_QSPI_Init +
    • >>   UART_WaitOnFlagUntilTimeout +
    • >>   UART_CheckIdleState +
    • >>   RCCEx_PLLSAI1_Config +
    • >>   HAL_QSPI_Transmit +
    • >>   HAL_QSPI_Receive +
    • >>   HAL_QSPI_Command +
    • >>   QSPI_WaitFlagStateUntilTimeout +
    + +

    HAL_IncTick (Thumb, 12 bytes, Stack size 0 bytes, stm32l4xx_hal.o(i.HAL_IncTick)) +

    [Called By]

    • >>   SysTick_Handler +
    + +

    HAL_Init (Thumb, 30 bytes, Stack size 8 bytes, stm32l4xx_hal.o(i.HAL_Init)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = HAL_Init ⇒ HAL_InitTick ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_MspInit +
    • >>   HAL_InitTick +
    • >>   HAL_NVIC_SetPriorityGrouping +
    +
    [Called By]
    • >>   board_init +
    + +

    HAL_InitTick (Thumb, 44 bytes, Stack size 16 bytes, stm32l4xx_hal.o(i.HAL_InitTick)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = HAL_InitTick ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_NVIC_SetPriority +
    • >>   HAL_SYSTICK_Config +
    +
    [Called By]
    • >>   HAL_RCC_OscConfig +
    • >>   HAL_RCC_ClockConfig +
    • >>   HAL_Init +
    + +

    HAL_MspInit (Thumb, 58 bytes, Stack size 8 bytes, stm32l4xx_hal_msp.o(i.HAL_MspInit)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_MspInit +
    +
    [Called By]
    • >>   HAL_Init +
    + +

    HAL_NVIC_EnableIRQ (Thumb, 32 bytes, Stack size 0 bytes, stm32l4xx_hal_cortex.o(i.HAL_NVIC_EnableIRQ)) +

    [Called By]

    • >>   HAL_UART_MspInit +
    • >>   MX_GPIO_Init +
    + +

    HAL_NVIC_SetPriority (Thumb, 124 bytes, Stack size 40 bytes, stm32l4xx_hal_cortex.o(i.HAL_NVIC_SetPriority)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   __NVIC_SetPriority +
    • >>   __NVIC_GetPriorityGrouping +
    +
    [Called By]
    • >>   HAL_UART_MspInit +
    • >>   MX_GPIO_Init +
    • >>   HAL_InitTick +
    + +

    HAL_NVIC_SetPriorityGrouping (Thumb, 32 bytes, Stack size 0 bytes, stm32l4xx_hal_cortex.o(i.HAL_NVIC_SetPriorityGrouping)) +

    [Called By]

    • >>   HAL_Init +
    + +

    HAL_PWREx_ControlVoltageScaling (Thumb, 128 bytes, Stack size 0 bytes, stm32l4xx_hal_pwr_ex.o(i.HAL_PWREx_ControlVoltageScaling)) +

    [Called By]

    • >>   SystemClock_Config +
    + +

    HAL_PWREx_GetVoltageRange (Thumb, 10 bytes, Stack size 0 bytes, stm32l4xx_hal_pwr_ex.o(i.HAL_PWREx_GetVoltageRange)) +

    [Called By]

    • >>   RCC_SetFlashLatencyFromMSIRange +
    + +

    HAL_PWR_EnableBkUpAccess (Thumb, 14 bytes, Stack size 0 bytes, stm32l4xx_hal_pwr.o(i.HAL_PWR_EnableBkUpAccess)) +

    [Called By]

    • >>   SystemClock_Config +
    + +

    HAL_QSPI_Command (Thumb, 164 bytes, Stack size 32 bytes, stm32l4xx_hal_qspi.o(i.HAL_QSPI_Command)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   HAL_GetTick +
    • >>   QSPI_WaitFlagStateUntilTimeout +
    • >>   QSPI_Config +
    +
    [Called By]
    • >>   QSPI_Send_CMD +
    + +

    HAL_QSPI_Init (Thumb, 206 bytes, Stack size 24 bytes, stm32l4xx_hal_qspi.o(i.HAL_QSPI_Init)) +

    [Stack]

    • Max Depth = 76
    • Call Chain = HAL_QSPI_Init ⇒ HAL_QSPI_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_QSPI_MspInit +
    • >>   HAL_GetTick +
    • >>   HAL_QSPI_SetTimeout +
    • >>   QSPI_WaitFlagStateUntilTimeout +
    +
    [Called By]
    • >>   MX_QUADSPI_Init +
    + +

    HAL_QSPI_MspInit (Thumb, 76 bytes, Stack size 32 bytes, quadspi.o(i.HAL_QSPI_MspInit)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = HAL_QSPI_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_GPIO_Init +
    +
    [Called By]
    • >>   HAL_QSPI_Init +
    + +

    HAL_QSPI_Receive (Thumb, 228 bytes, Stack size 40 bytes, stm32l4xx_hal_qspi.o(i.HAL_QSPI_Receive)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = HAL_QSPI_Receive ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   HAL_GetTick +
    • >>   QSPI_WaitFlagStateUntilTimeout +
    +
    [Called By]
    • >>   QSPI_Receive +
    + +

    HAL_QSPI_SetTimeout (Thumb, 4 bytes, Stack size 0 bytes, stm32l4xx_hal_qspi.o(i.HAL_QSPI_SetTimeout)) +

    [Called By]

    • >>   HAL_QSPI_Init +
    + +

    HAL_QSPI_Transmit (Thumb, 212 bytes, Stack size 32 bytes, stm32l4xx_hal_qspi.o(i.HAL_QSPI_Transmit)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = HAL_QSPI_Transmit ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   HAL_GetTick +
    • >>   QSPI_WaitFlagStateUntilTimeout +
    +
    [Called By]
    • >>   QSPI_Transmit +
    + +

    HAL_RCCEx_EnableMSIPLLMode (Thumb, 14 bytes, Stack size 0 bytes, stm32l4xx_hal_rcc_ex.o(i.HAL_RCCEx_EnableMSIPLLMode)) +

    [Called By]

    • >>   SystemClock_Config +
    + +

    HAL_RCCEx_PeriphCLKConfig (Thumb, 894 bytes, Stack size 32 bytes, stm32l4xx_hal_rcc_ex.o(i.HAL_RCCEx_PeriphCLKConfig)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = HAL_RCCEx_PeriphCLKConfig ⇒ RCCEx_PLLSAI1_Config +
    +
    [Calls]
    • >>   HAL_GetTick +
    • >>   RCCEx_PLLSAI1_Config +
    +
    [Called By]
    • >>   SystemClock_Config +
    + +

    HAL_RCC_ClockConfig (Thumb, 358 bytes, Stack size 24 bytes, stm32l4xx_hal_rcc.o(i.HAL_RCC_ClockConfig)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = HAL_RCC_ClockConfig ⇒ HAL_InitTick ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_RCC_GetSysClockFreq +
    • >>   HAL_GetTick +
    • >>   HAL_InitTick +
    +
    [Called By]
    • >>   SystemClock_Config +
    + +

    HAL_RCC_GetHCLKFreq (Thumb, 6 bytes, Stack size 0 bytes, stm32l4xx_hal_rcc.o(i.HAL_RCC_GetHCLKFreq)) +

    [Called By]

    • >>   HAL_RCC_GetPCLK2Freq +
    • >>   HAL_RCC_GetPCLK1Freq +
    + +

    HAL_RCC_GetPCLK1Freq (Thumb, 26 bytes, Stack size 4 bytes, stm32l4xx_hal_rcc.o(i.HAL_RCC_GetPCLK1Freq)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = HAL_RCC_GetPCLK1Freq +
    +
    [Calls]
    • >>   HAL_RCC_GetHCLKFreq +
    +
    [Called By]
    • >>   UART_SetConfig +
    + +

    HAL_RCC_GetPCLK2Freq (Thumb, 26 bytes, Stack size 4 bytes, stm32l4xx_hal_rcc.o(i.HAL_RCC_GetPCLK2Freq)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = HAL_RCC_GetPCLK2Freq +
    +
    [Calls]
    • >>   HAL_RCC_GetHCLKFreq +
    +
    [Called By]
    • >>   UART_SetConfig +
    + +

    HAL_RCC_GetSysClockFreq (Thumb, 266 bytes, Stack size 24 bytes, stm32l4xx_hal_rcc.o(i.HAL_RCC_GetSysClockFreq)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_RCC_GetSysClockFreq +
    +
    [Called By]
    • >>   HAL_RCC_OscConfig +
    • >>   HAL_RCC_ClockConfig +
    • >>   UART_SetConfig +
    + +

    HAL_RCC_OscConfig (Thumb, 1660 bytes, Stack size 32 bytes, stm32l4xx_hal_rcc.o(i.HAL_RCC_OscConfig)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = HAL_RCC_OscConfig ⇒ HAL_InitTick ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_RCC_GetSysClockFreq +
    • >>   HAL_GetTick +
    • >>   RCC_SetFlashLatencyFromMSIRange +
    • >>   HAL_InitTick +
    +
    [Called By]
    • >>   SystemClock_Config +
    + +

    HAL_SYSTICK_Config (Thumb, 52 bytes, Stack size 16 bytes, stm32l4xx_hal_cortex.o(i.HAL_SYSTICK_Config)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_SYSTICK_Config ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   __NVIC_SetPriority +
    +
    [Called By]
    • >>   HAL_InitTick +
    + +

    HAL_UARTEx_WakeupCallback (Thumb, 2 bytes, Stack size 0 bytes, stm32l4xx_hal_uart_ex.o(i.HAL_UARTEx_WakeupCallback)) +

    [Called By]

    • >>   HAL_UART_IRQHandler +
    + +

    HAL_UART_ErrorCallback (Thumb, 2 bytes, Stack size 0 bytes, stm32l4xx_hal_uart.o(i.HAL_UART_ErrorCallback)) +

    [Called By]

    • >>   HAL_UART_IRQHandler +
    • >>   UART_DMAAbortOnError +
    + +

    HAL_UART_IRQHandler (Thumb, 392 bytes, Stack size 24 bytes, stm32l4xx_hal_uart.o(i.HAL_UART_IRQHandler)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = HAL_UART_IRQHandler ⇒ HAL_DMA_Abort_IT +
    +
    [Calls]
    • >>   HAL_UART_ErrorCallback +
    • >>   HAL_UARTEx_WakeupCallback +
    • >>   HAL_DMA_Abort_IT +
    • >>   UART_EndTransmit_IT +
    • >>   UART_EndRxTransfer +
    +
    [Called By]
    • >>   USART3_IRQHandler +
    • >>   USART2_IRQHandler +
    • >>   LPUART1_IRQHandler +
    + +

    HAL_UART_Init (Thumb, 120 bytes, Stack size 8 bytes, stm32l4xx_hal_uart.o(i.HAL_UART_Init)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = HAL_UART_Init ⇒ HAL_UART_MspInit ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_UART_MspInit +
    • >>   UART_SetConfig +
    • >>   UART_CheckIdleState +
    • >>   UART_AdvFeatureConfig +
    +
    [Called By]
    • >>   MX_USART3_UART_Init +
    • >>   MX_USART2_UART_Init +
    + +

    HAL_UART_MspInit (Thumb, 342 bytes, Stack size 32 bytes, usart.o(i.HAL_UART_MspInit)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = HAL_UART_MspInit ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_NVIC_SetPriority +
    • >>   HAL_NVIC_EnableIRQ +
    • >>   HAL_GPIO_Init +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   HAL_UART_Init +
    + +

    HAL_UART_Transmit (Thumb, 200 bytes, Stack size 32 bytes, stm32l4xx_hal_uart.o(i.HAL_UART_Transmit)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = HAL_UART_Transmit ⇒ UART_WaitOnFlagUntilTimeout +
    +
    [Calls]
    • >>   HAL_GetTick +
    • >>   UART_WaitOnFlagUntilTimeout +
    +
    [Called By]
    • >>   fputc +
    + +

    HAL_UART_TxCpltCallback (Thumb, 2 bytes, Stack size 0 bytes, stm32l4xx_hal_uart.o(i.HAL_UART_TxCpltCallback)) +

    [Called By]

    • >>   UART_EndTransmit_IT +
    + +

    HardFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32l4xx_it.o(i.HardFault_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    IIC_Start (Thumb, 48 bytes, Stack size 8 bytes, oled.o(i.IIC_Start)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = IIC_Start +
    +
    [Calls]
    • >>   HAL_GPIO_WritePin +
    +
    [Called By]
    • >>   Write_IIC_Data +
    • >>   Write_IIC_Command +
    + +

    IIC_Stop (Thumb, 36 bytes, Stack size 8 bytes, oled.o(i.IIC_Stop)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = IIC_Stop +
    +
    [Calls]
    • >>   HAL_GPIO_WritePin +
    +
    [Called By]
    • >>   Write_IIC_Data +
    • >>   Write_IIC_Command +
    + +

    IIC_Wait_Ack (Thumb, 28 bytes, Stack size 8 bytes, oled.o(i.IIC_Wait_Ack)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = IIC_Wait_Ack +
    +
    [Calls]
    • >>   HAL_GPIO_WritePin +
    +
    [Called By]
    • >>   Write_IIC_Data +
    • >>   Write_IIC_Command +
    + +

    LPUART1_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32l4xx_it.o(i.LPUART1_IRQHandler)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = LPUART1_IRQHandler ⇒ HAL_UART_IRQHandler ⇒ HAL_DMA_Abort_IT +
    +
    [Calls]
    • >>   HAL_UART_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    MX_GPIO_Init (Thumb, 316 bytes, Stack size 32 bytes, gpio.o(i.MX_GPIO_Init)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = MX_GPIO_Init ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_NVIC_SetPriority +
    • >>   HAL_NVIC_EnableIRQ +
    • >>   HAL_GPIO_WritePin +
    • >>   HAL_GPIO_Init +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   board_init +
    + +

    MX_QUADSPI_Init (Thumb, 52 bytes, Stack size 8 bytes, quadspi.o(i.MX_QUADSPI_Init)) +

    [Stack]

    • Max Depth = 84
    • Call Chain = MX_QUADSPI_Init ⇒ HAL_QSPI_Init ⇒ HAL_QSPI_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_QSPI_Init +
    +
    [Called By]
    • >>   task +
    + +

    MX_USART2_UART_Init (Thumb, 56 bytes, Stack size 8 bytes, usart.o(i.MX_USART2_UART_Init)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = MX_USART2_UART_Init ⇒ HAL_UART_Init ⇒ HAL_UART_MspInit ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_UART_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   board_init +
    + +

    MX_USART3_UART_Init (Thumb, 56 bytes, Stack size 8 bytes, usart.o(i.MX_USART3_UART_Init)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = MX_USART3_UART_Init ⇒ HAL_UART_Init ⇒ HAL_UART_MspInit ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_UART_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   board_init +
    + +

    MemManage_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32l4xx_it.o(i.MemManage_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    NMI_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32l4xx_it.o(i.NMI_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    OLED_Clear (Thumb, 62 bytes, Stack size 16 bytes, oled.o(i.OLED_Clear)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = OLED_Clear ⇒ OLED_WR_Byte ⇒ Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   OLED_WR_Byte +
    +
    [Called By]
    • >>   OLED_Init +
    • >>   board_init +
    + +

    OLED_Init (Thumb, 198 bytes, Stack size 8 bytes, oled.o(i.OLED_Init)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = OLED_Init ⇒ OLED_Clear ⇒ OLED_WR_Byte ⇒ Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   OLED_Clear +
    • >>   HAL_Delay +
    • >>   OLED_WR_Byte +
    +
    [Called By]
    • >>   board_init +
    + +

    OLED_Set_Pos (Thumb, 40 bytes, Stack size 16 bytes, oled.o(i.OLED_Set_Pos)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = OLED_Set_Pos ⇒ OLED_WR_Byte ⇒ Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   OLED_WR_Byte +
    +
    [Called By]
    • >>   OLED_ShowChinese +
    • >>   OLED_ShowChar +
    + +

    OLED_ShowChar (Thumb, 154 bytes, Stack size 32 bytes, oled.o(i.OLED_ShowChar)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = OLED_ShowChar ⇒ OLED_Set_Pos ⇒ OLED_WR_Byte ⇒ Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   OLED_WR_Byte +
    • >>   OLED_Set_Pos +
    +
    [Called By]
    • >>   OLED_ShowString +
    + +

    OLED_ShowChinese (Thumb, 98 bytes, Stack size 24 bytes, oled.o(i.OLED_ShowChinese)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = OLED_ShowChinese ⇒ OLED_Set_Pos ⇒ OLED_WR_Byte ⇒ Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   OLED_WR_Byte +
    • >>   OLED_Set_Pos +
    +
    [Called By]
    • >>   board_init +
    + +

    OLED_ShowString (Thumb, 58 bytes, Stack size 24 bytes, oled.o(i.OLED_ShowString)) +

    [Stack]

    • Max Depth = 120
    • Call Chain = OLED_ShowString ⇒ OLED_ShowChar ⇒ OLED_Set_Pos ⇒ OLED_WR_Byte ⇒ Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   OLED_ShowChar +
    +
    [Called By]
    • >>   board_init +
    + +

    OLED_WR_Byte (Thumb, 24 bytes, Stack size 16 bytes, oled.o(i.OLED_WR_Byte)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = OLED_WR_Byte ⇒ Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   Write_IIC_Data +
    • >>   Write_IIC_Command +
    +
    [Called By]
    • >>   OLED_ShowChinese +
    • >>   OLED_Init +
    • >>   OLED_Clear +
    • >>   OLED_ShowChar +
    • >>   OLED_Set_Pos +
    + +

    QSPI_Receive (Thumb, 36 bytes, Stack size 16 bytes, hal_qspi_flash_1.o(i.QSPI_Receive)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = QSPI_Receive ⇒ HAL_QSPI_Receive ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   HAL_QSPI_Receive +
    +
    [Called By]
    • >>   hal_spi_flash_read +
    • >>   prv_spi_flash_wait_write_end +
    + +

    QSPI_Send_CMD (Thumb, 70 bytes, Stack size 88 bytes, hal_qspi_flash_1.o(i.QSPI_Send_CMD)) +

    [Stack]

    • Max Depth = 144
    • Call Chain = QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   HAL_QSPI_Command +
    +
    [Called By]
    • >>   prv_spi_flash_erase_sector +
    • >>   hal_spi_flash_read +
    • >>   prv_spi_flash_write_page +
    • >>   prv_spi_flash_write_enable +
    • >>   prv_spi_flash_wait_write_end +
    + +

    QSPI_Transmit (Thumb, 36 bytes, Stack size 16 bytes, hal_qspi_flash_1.o(i.QSPI_Transmit)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = QSPI_Transmit ⇒ HAL_QSPI_Transmit ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   HAL_QSPI_Transmit +
    +
    [Called By]
    • >>   prv_spi_flash_write_page +
    + +

    SVC_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32l4xx_it.o(i.SVC_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    SysTick_Handler (Thumb, 26 bytes, Stack size 8 bytes, stm32l4xx_it.o(i.SysTick_Handler)) +

    [Stack]

    • Max Depth = 104 + Unknown Stack Size +
    • Call Chain = SysTick_Handler ⇒ tos_tick_handler ⇒ tick_update ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tos_tick_handler +
    • >>   tos_knl_is_running +
    • >>   tos_knl_irq_leave +
    • >>   tos_knl_irq_enter +
    • >>   HAL_IncTick +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    SystemClock_Config (Thumb, 214 bytes, Stack size 184 bytes, mcu_init.o(i.SystemClock_Config)) +

    [Stack]

    • Max Depth = 280
    • Call Chain = SystemClock_Config ⇒ HAL_RCC_OscConfig ⇒ HAL_InitTick ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_RCC_OscConfig +
    • >>   HAL_RCC_ClockConfig +
    • >>   HAL_RCCEx_PeriphCLKConfig +
    • >>   HAL_RCCEx_EnableMSIPLLMode +
    • >>   HAL_PWR_EnableBkUpAccess +
    • >>   HAL_PWREx_ControlVoltageScaling +
    • >>   Error_Handler +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   board_init +
    + +

    SystemInit (Thumb, 68 bytes, Stack size 0 bytes, system_stm32l4xx.o(i.SystemInit)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(.text) +
    +

    UART_AdvFeatureConfig (Thumb, 248 bytes, Stack size 0 bytes, stm32l4xx_hal_uart.o(i.UART_AdvFeatureConfig)) +

    [Called By]

    • >>   HAL_UART_Init +
    + +

    UART_CheckIdleState (Thumb, 116 bytes, Stack size 16 bytes, stm32l4xx_hal_uart.o(i.UART_CheckIdleState)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = UART_CheckIdleState ⇒ UART_WaitOnFlagUntilTimeout +
    +
    [Calls]
    • >>   HAL_GetTick +
    • >>   UART_WaitOnFlagUntilTimeout +
    +
    [Called By]
    • >>   HAL_UART_Init +
    + +

    UART_SetConfig (Thumb, 1000 bytes, Stack size 40 bytes, stm32l4xx_hal_uart.o(i.UART_SetConfig)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = UART_SetConfig ⇒ __aeabi_uldivmod +
    +
    [Calls]
    • >>   HAL_RCC_GetSysClockFreq +
    • >>   HAL_RCC_GetPCLK2Freq +
    • >>   HAL_RCC_GetPCLK1Freq +
    • >>   __aeabi_uldivmod +
    +
    [Called By]
    • >>   HAL_UART_Init +
    + +

    UART_WaitOnFlagUntilTimeout (Thumb, 108 bytes, Stack size 24 bytes, stm32l4xx_hal_uart.o(i.UART_WaitOnFlagUntilTimeout)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = UART_WaitOnFlagUntilTimeout +
    +
    [Calls]
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   HAL_UART_Transmit +
    • >>   UART_CheckIdleState +
    + +

    USART2_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32l4xx_it.o(i.USART2_IRQHandler)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = USART2_IRQHandler ⇒ HAL_UART_IRQHandler ⇒ HAL_DMA_Abort_IT +
    +
    [Calls]
    • >>   HAL_UART_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    USART3_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32l4xx_it.o(i.USART3_IRQHandler)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = USART3_IRQHandler ⇒ HAL_UART_IRQHandler ⇒ HAL_DMA_Abort_IT +
    +
    [Calls]
    • >>   HAL_UART_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32l431xx.o(RESET) +
    +

    UsageFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, stm32l4xx_it.o(i.UsageFault_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32l431xx.o(RESET) +
    +

    Write_IIC_Byte (Thumb, 96 bytes, Stack size 24 bytes, oled.o(i.Write_IIC_Byte)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = Write_IIC_Byte +
    +
    [Calls]
    • >>   HAL_GPIO_WritePin +
    +
    [Called By]
    • >>   Write_IIC_Data +
    • >>   Write_IIC_Command +
    + +

    Write_IIC_Command (Thumb, 44 bytes, Stack size 8 bytes, oled.o(i.Write_IIC_Command)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = Write_IIC_Command ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   Write_IIC_Byte +
    • >>   IIC_Wait_Ack +
    • >>   IIC_Stop +
    • >>   IIC_Start +
    +
    [Called By]
    • >>   OLED_WR_Byte +
    + +

    Write_IIC_Data (Thumb, 44 bytes, Stack size 8 bytes, oled.o(i.Write_IIC_Data)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = Write_IIC_Data ⇒ Write_IIC_Byte +
    +
    [Calls]
    • >>   Write_IIC_Byte +
    • >>   IIC_Wait_Ack +
    • >>   IIC_Stop +
    • >>   IIC_Start +
    +
    [Called By]
    • >>   OLED_WR_Byte +
    + +

    __0printf$5 (Thumb, 22 bytes, Stack size 24 bytes, printf5.o(i.__0printf$5), UNUSED) +

    [Calls]

    • >>   _printf_core +
    + +

    __1printf$5 (Thumb, 0 bytes, Stack size 24 bytes, printf5.o(i.__0printf$5), UNUSED) + +

    __2printf (Thumb, 0 bytes, Stack size 24 bytes, printf5.o(i.__0printf$5)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = __2printf +
    +
    [Called By]
    • >>   main +
    • >>   tos_kv_walkthru +
    • >>   tos_kv_init +
    • >>   task +
    • >>   disp_value +
    • >>   kv_u8_disp +
    • >>   kv_block_walkthru +
    + +

    __scatterload_copy (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED) + +

    __scatterload_null (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED) + +

    __scatterload_zeroinit (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED) + +

    application_entry (Thumb, 14 bytes, Stack size 8 bytes, kv_sample.o(i.application_entry)) +

    [Stack]

    • Max Depth = 120 + Unknown Stack Size +
    • Call Chain = application_entry ⇒ osThreadCreate ⇒ tos_task_create ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   osThreadCreate +
    +
    [Address Reference Count : 1]
    • main.o(.constdata) +
    +

    board_init (Thumb, 110 bytes, Stack size 8 bytes, mcu_init.o(i.board_init)) +

    [Stack]

    • Max Depth = 288
    • Call Chain = board_init ⇒ SystemClock_Config ⇒ HAL_RCC_OscConfig ⇒ HAL_InitTick ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   OLED_ShowString +
    • >>   OLED_ShowChinese +
    • >>   OLED_Init +
    • >>   OLED_Clear +
    • >>   MX_USART3_UART_Init +
    • >>   MX_USART2_UART_Init +
    • >>   HAL_Init +
    • >>   DHT11_Init +
    • >>   SystemClock_Config +
    • >>   MX_GPIO_Init +
    +
    [Called By]
    • >>   main +
    + +

    cpu_context_switch (Thumb, 8 bytes, Stack size 8 bytes, tos_cpu.o(i.cpu_context_switch)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = cpu_context_switch +
    +
    [Calls]
    • >>   port_context_switch +
    +
    [Called By]
    • >>   knl_sched +
    + +

    cpu_init (Thumb, 30 bytes, Stack size 8 bytes, tos_cpu.o(i.cpu_init)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = cpu_init ⇒ __aeabi_uldivmod +
    +
    [Calls]
    • >>   cpu_systick_init +
    • >>   __aeabi_uldivmod +
    +
    [Called By]
    • >>   tos_knl_init +
    + +

    cpu_irq_context_switch (Thumb, 8 bytes, Stack size 8 bytes, tos_cpu.o(i.cpu_irq_context_switch)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = cpu_irq_context_switch +
    +
    [Calls]
    • >>   port_irq_context_switch +
    +
    [Called By]
    • >>   tos_knl_irq_leave +
    + +

    cpu_sched_start (Thumb, 4 bytes, Stack size 0 bytes, tos_cpu.o(i.cpu_sched_start)) +

    [Calls]

    • >>   port_sched_start +
    +
    [Called By]
    • >>   tos_knl_start +
    + +

    cpu_systick_init (Thumb, 18 bytes, Stack size 8 bytes, tos_cpu.o(i.cpu_systick_init)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = cpu_systick_init ⇒ port_systick_config ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   port_systick_priority_set +
    • >>   port_systick_config +
    +
    [Called By]
    • >>   cpu_init +
    + +

    cpu_task_stk_init (Thumb, 216 bytes, Stack size 20 bytes, tos_cpu.o(i.cpu_task_stk_init)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = cpu_task_stk_init +
    +
    [Called By]
    • >>   tos_task_create +
    + +

    disp_value (Thumb, 48 bytes, Stack size 16 bytes, kv_sample.o(i.disp_value)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = disp_value ⇒ __2printf +
    +
    [Calls]
    • >>   __2printf +
    +
    [Called By]
    • >>   task +
    + +

    fputc (Thumb, 42 bytes, Stack size 16 bytes, mcu_init.o(i.fputc)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = fputc ⇒ HAL_UART_Transmit ⇒ UART_WaitOnFlagUntilTimeout +
    +
    [Calls]
    • >>   HAL_UART_Transmit +
    +
    [Address Reference Count : 1]
    • printf5.o(i.__0printf$5) +
    +

    hal_spi_flash_erase (Thumb, 80 bytes, Stack size 24 bytes, hal_qspi_flash_1.o(i.hal_spi_flash_erase)) +

    [Stack]

    • Max Depth = 216
    • Call Chain = hal_spi_flash_erase ⇒ prv_spi_flash_erase_sector ⇒ prv_spi_flash_wait_write_end ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   prv_spi_flash_erase_sector +
    +
    [Called By]
    • >>   stm32l4_qspiflash_erase +
    + +

    hal_spi_flash_read (Thumb, 84 bytes, Stack size 40 bytes, hal_qspi_flash_1.o(i.hal_spi_flash_read)) +

    [Stack]

    • Max Depth = 184
    • Call Chain = hal_spi_flash_read ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   QSPI_Send_CMD +
    • >>   QSPI_Receive +
    +
    [Called By]
    • >>   stm32l4_qspiflash_read +
    + +

    hal_spi_flash_write (Thumb, 466 bytes, Stack size 64 bytes, hal_qspi_flash_1.o(i.hal_spi_flash_write)) +

    [Stack]

    • Max Depth = 264
    • Call Chain = hal_spi_flash_write ⇒ prv_spi_flash_write_page ⇒ prv_spi_flash_wait_write_end ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   prv_spi_flash_write_page +
    +
    [Called By]
    • >>   stm32l4_qspiflash_write +
    + +

    knl_idle_init (Thumb, 38 bytes, Stack size 24 bytes, tos_sys.o(i.knl_idle_init)) +

    [Stack]

    • Max Depth = 96 + Unknown Stack Size +
    • Call Chain = knl_idle_init ⇒ tos_task_create ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tos_task_create +
    +
    [Called By]
    • >>   tos_knl_init +
    + +

    knl_is_idle (Thumb, 16 bytes, Stack size 0 bytes, tos_sys.o(i.knl_is_idle)) +

    [Called By]

    • >>   task_do_destroy +
    • >>   tos_task_create +
    + +

    knl_is_inirq (Thumb, 14 bytes, Stack size 0 bytes, tos_sys.o(i.knl_is_inirq)) +

    [Called By]

    • >>   tos_knl_irq_leave +
    • >>   knl_sched +
    • >>   tos_task_prio_change +
    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    • >>   tos_mutex_create +
    • >>   tos_task_destroy +
    • >>   tos_task_create +
    • >>   tos_knl_sched_unlock +
    • >>   tos_knl_sched_lock +
    + +

    knl_is_sched_locked (Thumb, 14 bytes, Stack size 0 bytes, tos_sys.o(i.knl_is_sched_locked)) +

    [Called By]

    • >>   tos_knl_irq_leave +
    • >>   knl_sched +
    • >>   tos_mutex_pend_timed +
    • >>   tos_task_destroy +
    • >>   tos_knl_sched_unlock +
    + +

    knl_is_self (Thumb, 18 bytes, Stack size 0 bytes, tos_sys.o(i.knl_is_self)) +

    [Called By]

    • >>   tos_knl_irq_leave +
    • >>   knl_sched +
    • >>   tos_task_prio_change +
    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    • >>   tos_task_destroy +
    + +

    knl_sched (Thumb, 94 bytes, Stack size 8 bytes, tos_sys.o(i.knl_sched)) +

    [Stack]

    • Max Depth = 16 + Unknown Stack Size +
    • Call Chain = knl_sched ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   knl_is_sched_locked +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   knl_is_self +
    • >>   cpu_context_switch +
    • >>   readyqueue_highest_ready_task_get +
    +
    [Called By]
    • >>   tos_task_prio_change +
    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    • >>   task_do_destroy +
    • >>   tos_task_create +
    • >>   tos_knl_sched_unlock +
    + +

    main (Thumb, 32 bytes, Stack size 8 bytes, main.o(i.main)) +

    [Stack]

    • Max Depth = 296 + Unknown Stack Size +
    • Call Chain = main ⇒ board_init ⇒ SystemClock_Config ⇒ HAL_RCC_OscConfig ⇒ HAL_InitTick ⇒ HAL_NVIC_SetPriority ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   osThreadCreate +
    • >>   osKernelStart +
    • >>   osKernelInitialize +
    • >>   board_init +
    • >>   __2printf +
    +
    [Address Reference Count : 1]
    • entry9a.o(.ARM.Collect$$$$0000000B) +
    +

    mmheap_init_with_pool (Thumb, 20 bytes, Stack size 16 bytes, tos_mmheap.o(i.mmheap_init_with_pool)) +

    [Stack]

    • Max Depth = 112 + Unknown Stack Size +
    • Call Chain = mmheap_init_with_pool ⇒ tos_mmheap_pool_add ⇒ blk_insert ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_mmheap_pool_add +
    • >>   mmheap_ctl_init +
    +
    [Called By]
    • >>   tos_knl_init +
    + +

    mutex_release (Thumb, 20 bytes, Stack size 8 bytes, tos_mutex.o(i.mutex_release)) +

    [Stack]

    • Max Depth = 88 + Unknown Stack Size +
    • Call Chain = mutex_release ⇒ pend_wakeup_all ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   pend_wakeup_all +
    • >>   mutex_old_owner_release +
    +
    [Called By]
    • >>   task_mutex_release +
    + +

    osKernelInitialize (Thumb, 14 bytes, Stack size 8 bytes, cmsis_os.o(i.osKernelInitialize)) +

    [Stack]

    • Max Depth = 128 + Unknown Stack Size +
    • Call Chain = osKernelInitialize ⇒ tos_knl_init ⇒ mmheap_init_with_pool ⇒ tos_mmheap_pool_add ⇒ blk_insert ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_knl_init +
    • >>   errno_knl2cmsis +
    +
    [Called By]
    • >>   main +
    + +

    osKernelStart (Thumb, 14 bytes, Stack size 8 bytes, cmsis_os.o(i.osKernelStart)) +

    [Stack]

    • Max Depth = 16 + Unknown Stack Size +
    • Call Chain = osKernelStart ⇒ tos_knl_start +
    +
    [Calls]
    • >>   tos_knl_start +
    • >>   errno_knl2cmsis +
    +
    [Called By]
    • >>   main +
    + +

    osThreadCreate (Thumb, 66 bytes, Stack size 40 bytes, cmsis_os.o(i.osThreadCreate)) +

    [Stack]

    • Max Depth = 112 + Unknown Stack Size +
    • Call Chain = osThreadCreate ⇒ tos_task_create ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tos_task_create +
    • >>   priority_cmsis2knl +
    +
    [Called By]
    • >>   main +
    • >>   application_entry +
    + +

    pend_highest_pending_prio_get (Thumb, 32 bytes, Stack size 16 bytes, tos_pend.o(i.pend_highest_pending_prio_get)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = pend_highest_pending_prio_get +
    +
    [Calls]
    • >>   tos_list_empty +
    +
    [Called By]
    • >>   tos_mutex_post +
    • >>   task_highest_pending_prio_get +
    + +

    pend_highest_pending_task_get (Thumb, 8 bytes, Stack size 0 bytes, tos_pend.o(i.pend_highest_pending_task_get)) +

    [Called By]

    • >>   tos_mutex_post +
    + +

    pend_is_nopending (Thumb, 12 bytes, Stack size 8 bytes, tos_pend.o(i.pend_is_nopending)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = pend_is_nopending +
    +
    [Calls]
    • >>   tos_list_empty +
    +
    [Called By]
    • >>   tos_mutex_post +
    + +

    pend_list_adjust (Thumb, 22 bytes, Stack size 8 bytes, tos_pend.o(i.pend_list_adjust)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = pend_list_adjust ⇒ pend_list_add +
    +
    [Calls]
    • >>   tos_list_del +
    • >>   pend_list_add +
    +
    [Called By]
    • >>   tos_task_prio_change +
    + +

    pend_list_remove (Thumb, 30 bytes, Stack size 8 bytes, tos_pend.o(i.pend_list_remove)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = pend_list_remove +
    +
    [Calls]
    • >>   tos_list_del +
    +
    [Called By]
    • >>   pend_task_wakeup +
    • >>   task_do_destroy +
    + +

    pend_object_init (Thumb, 12 bytes, Stack size 8 bytes, tos_pend.o(i.pend_object_init)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = pend_object_init +
    +
    [Calls]
    • >>   tos_list_init +
    +
    [Called By]
    • >>   tos_mutex_create +
    + +

    pend_state2errno (Thumb, 46 bytes, Stack size 0 bytes, tos_pend.o(i.pend_state2errno)) +

    [Called By]

    • >>   tos_mutex_pend_timed +
    + +

    pend_task_block (Thumb, 60 bytes, Stack size 24 bytes, tos_pend.o(i.pend_task_block)) +

    [Stack]

    • Max Depth = 104 + Unknown Stack Size +
    • Call Chain = pend_task_block ⇒ tick_list_add ⇒ tick_task_place ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tick_list_add +
    • >>   readyqueue_remove +
    • >>   pend_list_add +
    +
    [Called By]
    • >>   tos_mutex_pend_timed +
    + +

    pend_task_wakeup (Thumb, 64 bytes, Stack size 16 bytes, tos_pend.o(i.pend_task_wakeup)) +

    [Stack]

    • Max Depth = 56 + Unknown Stack Size +
    • Call Chain = pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tick_list_remove +
    • >>   readyqueue_add +
    • >>   pend_list_remove +
    +
    [Called By]
    • >>   pend_wakeup_all +
    • >>   pend_wakeup_one +
    • >>   tick_update +
    + +

    pend_wakeup_all (Thumb, 36 bytes, Stack size 24 bytes, tos_pend.o(i.pend_wakeup_all)) +

    [Stack]

    • Max Depth = 80 + Unknown Stack Size +
    • Call Chain = pend_wakeup_all ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   pend_task_wakeup +
    +
    [Called By]
    • >>   mutex_release +
    + +

    pend_wakeup_one (Thumb, 20 bytes, Stack size 16 bytes, tos_pend.o(i.pend_wakeup_one)) +

    [Stack]

    • Max Depth = 72 + Unknown Stack Size +
    • Call Chain = pend_wakeup_one ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   pend_task_wakeup +
    +
    [Called By]
    • >>   tos_mutex_post +
    + +

    port_systick_config (Thumb, 50 bytes, Stack size 16 bytes, port_c.o(i.port_systick_config)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = port_systick_config ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   __NVIC_SetPriority +
    +
    [Called By]
    • >>   cpu_systick_init +
    + +

    port_systick_priority_set (Thumb, 16 bytes, Stack size 8 bytes, port_c.o(i.port_systick_priority_set)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = port_systick_priority_set ⇒ __NVIC_SetPriority +
    +
    [Calls]
    • >>   __NVIC_SetPriority +
    +
    [Called By]
    • >>   cpu_systick_init +
    + +

    prv_spi_flash_erase_sector (Thumb, 50 bytes, Stack size 24 bytes, hal_qspi_flash_1.o(i.prv_spi_flash_erase_sector)) +

    [Stack]

    • Max Depth = 192
    • Call Chain = prv_spi_flash_erase_sector ⇒ prv_spi_flash_wait_write_end ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   QSPI_Send_CMD +
    • >>   prv_spi_flash_write_enable +
    • >>   prv_spi_flash_wait_write_end +
    +
    [Called By]
    • >>   hal_spi_flash_erase +
    + +

    readyqueue_add (Thumb, 32 bytes, Stack size 8 bytes, tos_sched.o(i.readyqueue_add)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   readyqueue_add_tail +
    • >>   readyqueue_add_head +
    +
    [Called By]
    • >>   pend_task_wakeup +
    + +

    readyqueue_add_head (Thumb, 48 bytes, Stack size 24 bytes, tos_sched.o(i.readyqueue_add_head)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = readyqueue_add_head +
    +
    [Calls]
    • >>   tos_list_empty +
    • >>   readyqueue_prio_mark +
    • >>   _list_add +
    +
    [Called By]
    • >>   readyqueue_add +
    • >>   tos_task_prio_change +
    + +

    readyqueue_add_tail (Thumb, 38 bytes, Stack size 16 bytes, tos_sched.o(i.readyqueue_add_tail)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tos_list_empty +
    • >>   tos_list_add_tail +
    • >>   readyqueue_prio_mark +
    +
    [Called By]
    • >>   readyqueue_add +
    • >>   tos_task_prio_change +
    • >>   tos_task_create +
    + +

    readyqueue_highest_ready_task_get (Thumb, 18 bytes, Stack size 0 bytes, tos_sched.o(i.readyqueue_highest_ready_task_get)) +

    [Called By]

    • >>   tos_knl_irq_leave +
    • >>   knl_sched +
    • >>   tos_knl_start +
    + +

    readyqueue_init (Thumb, 60 bytes, Stack size 0 bytes, tos_sched.o(i.readyqueue_init)) +

    [Called By]

    • >>   tos_knl_init +
    + +

    readyqueue_remove (Thumb, 94 bytes, Stack size 16 bytes, tos_sched.o(i.readyqueue_remove)) +

    [Stack]

    • Max Depth = 40 + Unknown Stack Size +
    • Call Chain = readyqueue_remove ⇒ readyqueue_prio_highest_get ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_list_empty +
    • >>   readyqueue_prio_highest_get +
    • >>   _list_del +
    +
    [Called By]
    • >>   pend_task_block +
    • >>   tos_task_prio_change +
    • >>   task_do_destroy +
    + +

    stm32l4_qspiflash_erase (Thumb, 16 bytes, Stack size 16 bytes, qspi_flash_kv.o(i.stm32l4_qspiflash_erase)) +

    [Stack]

    • Max Depth = 232
    • Call Chain = stm32l4_qspiflash_erase ⇒ hal_spi_flash_erase ⇒ prv_spi_flash_erase_sector ⇒ prv_spi_flash_wait_write_end ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   hal_spi_flash_erase +
    +
    [Address Reference Count : 1]
    • qspi_flash_kv.o(.data) +
    +

    stm32l4_qspiflash_read (Thumb, 20 bytes, Stack size 16 bytes, qspi_flash_kv.o(i.stm32l4_qspiflash_read)) +

    [Stack]

    • Max Depth = 200
    • Call Chain = stm32l4_qspiflash_read ⇒ hal_spi_flash_read ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   hal_spi_flash_read +
    +
    [Address Reference Count : 1]
    • qspi_flash_kv.o(.data) +
    +

    stm32l4_qspiflash_write (Thumb, 22 bytes, Stack size 24 bytes, qspi_flash_kv.o(i.stm32l4_qspiflash_write)) +

    [Stack]

    • Max Depth = 288
    • Call Chain = stm32l4_qspiflash_write ⇒ hal_spi_flash_write ⇒ prv_spi_flash_write_page ⇒ prv_spi_flash_wait_write_end ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   hal_spi_flash_write +
    +
    [Address Reference Count : 1]
    • qspi_flash_kv.o(.data) +
    +

    task (Thumb, 256 bytes, Stack size 64 bytes, kv_sample.o(i.task)) +

    [Stack]

    • Max Depth = 392 + Unknown Stack Size +
    • Call Chain = task ⇒ tos_kv_set ⇒ kv_item_update ⇒ kv_item_save ⇒ kv_blk_search_suitable ⇒ kv_gc ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_kv_walkthru +
    • >>   tos_kv_set +
    • >>   tos_kv_init +
    • >>   tos_kv_has_key +
    • >>   tos_kv_get +
    • >>   tos_kv_del +
    • >>   disp_value +
    • >>   MX_QUADSPI_Init +
    • >>   __2printf +
    +
    [Address Reference Count : 1]
    • kv_sample.o(.constdata) +
    +

    task_free_all (Thumb, 66 bytes, Stack size 24 bytes, tos_task.o(i.task_free_all)) +

    [Stack]

    • Max Depth = 136 + Unknown Stack Size +
    • Call Chain = task_free_all ⇒ task_free ⇒ tos_mmheap_free ⇒ blk_merge_prev ⇒ blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   tos_list_del +
    • >>   task_free +
    +
    [Called By]
    • >>   knl_idle_entry +
    + +

    tick_list_add (Thumb, 32 bytes, Stack size 16 bytes, tos_tick.o(i.tick_list_add)) +

    [Stack]

    • Max Depth = 80 + Unknown Stack Size +
    • Call Chain = tick_list_add ⇒ tick_task_place ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tick_task_place +
    +
    [Called By]
    • >>   pend_task_block +
    + +

    tick_list_remove (Thumb, 24 bytes, Stack size 8 bytes, tos_tick.o(i.tick_list_remove)) +

    [Stack]

    • Max Depth = 32 + Unknown Stack Size +
    • Call Chain = tick_list_remove ⇒ tick_task_takeoff ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tick_task_takeoff +
    +
    [Called By]
    • >>   pend_task_wakeup +
    • >>   task_do_destroy +
    + +

    tick_update (Thumb, 180 bytes, Stack size 32 bytes, tos_tick.o(i.tick_update)) +

    [Stack]

    • Max Depth = 88 + Unknown Stack Size +
    • Call Chain = tick_update ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   pend_task_wakeup +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   tos_list_empty +
    +
    [Called By]
    • >>   tos_tick_handler +
    + +

    timer_init (Thumb, 4 bytes, Stack size 0 bytes, tos_timer.o(i.timer_init)) +

    [Called By]

    • >>   tos_knl_init +
    + +

    timer_update (Thumb, 118 bytes, Stack size 16 bytes, tos_timer.o(i.timer_update)) +

    [Stack]

    • Max Depth = 48 + Unknown Stack Size +
    • Call Chain = timer_update ⇒ timer_takeoff ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_knl_sched_unlock +
    • >>   tos_knl_sched_lock +
    • >>   timer_takeoff +
    • >>   timer_place +
    +
    [Called By]
    • >>   tos_tick_handler +
    + +

    tos_cpu_clz (Thumb, 12 bytes, Stack size 8 bytes, tos_cpu.o(i.tos_cpu_clz)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = tos_cpu_clz +
    +
    [Calls]
    • >>   port_clz +
    +
    [Called By]
    • >>   generic_fls +
    • >>   readyqueue_prio_highest_get +
    + +

    tos_cpu_cpsr_restore (Thumb, 12 bytes, Stack size 8 bytes, tos_cpu.o(i.tos_cpu_cpsr_restore)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = tos_cpu_cpsr_restore +
    +
    [Calls]
    • >>   port_cpsr_restore +
    +
    [Called By]
    • >>   tos_knl_irq_leave +
    • >>   knl_sched +
    • >>   tos_task_prio_change +
    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    • >>   tick_task_takeoff +
    • >>   tick_task_place +
    • >>   task_do_destroy +
    • >>   tos_task_create +
    • >>   task_free_all +
    • >>   tos_knl_sched_unlock +
    • >>   tos_knl_sched_lock +
    • >>   timer_takeoff +
    • >>   timer_place +
    • >>   tick_update +
    + +

    tos_cpu_cpsr_save (Thumb, 8 bytes, Stack size 8 bytes, tos_cpu.o(i.tos_cpu_cpsr_save)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   port_cpsr_save +
    +
    [Called By]
    • >>   tos_knl_irq_leave +
    • >>   knl_sched +
    • >>   tos_task_prio_change +
    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    • >>   tick_task_takeoff +
    • >>   tick_task_place +
    • >>   task_do_destroy +
    • >>   tos_task_create +
    • >>   task_free_all +
    • >>   tos_knl_sched_unlock +
    • >>   tos_knl_sched_lock +
    • >>   timer_takeoff +
    • >>   timer_place +
    • >>   tick_update +
    + +

    tos_knl_init (Thumb, 56 bytes, Stack size 8 bytes, tos_sys.o(i.tos_knl_init)) +

    [Stack]

    • Max Depth = 120 + Unknown Stack Size +
    • Call Chain = tos_knl_init ⇒ mmheap_init_with_pool ⇒ tos_mmheap_pool_add ⇒ blk_insert ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   mmheap_init_with_pool +
    • >>   timer_init +
    • >>   cpu_init +
    • >>   knl_idle_init +
    • >>   readyqueue_init +
    +
    [Called By]
    • >>   osKernelInitialize +
    + +

    tos_knl_irq_enter (Thumb, 42 bytes, Stack size 4 bytes, tos_sys.o(i.tos_knl_irq_enter)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = tos_knl_irq_enter +
    +
    [Calls]
    • >>   tos_knl_is_running +
    +
    [Called By]
    • >>   SysTick_Handler +
    + +

    tos_knl_irq_leave (Thumb, 134 bytes, Stack size 8 bytes, tos_sys.o(i.tos_knl_irq_leave)) +

    [Stack]

    • Max Depth = 16 + Unknown Stack Size +
    • Call Chain = tos_knl_irq_leave ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   knl_is_sched_locked +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   knl_is_self +
    • >>   cpu_irq_context_switch +
    • >>   readyqueue_highest_ready_task_get +
    +
    [Called By]
    • >>   SysTick_Handler +
    + +

    tos_knl_is_running (Thumb, 14 bytes, Stack size 0 bytes, tos_sys.o(i.tos_knl_is_running)) +

    [Called By]

    • >>   tos_tick_handler +
    • >>   tos_knl_irq_leave +
    • >>   tos_knl_irq_enter +
    • >>   SysTick_Handler +
    • >>   knl_sched +
    • >>   tos_task_create +
    • >>   tos_knl_start +
    • >>   tos_knl_sched_unlock +
    • >>   tos_knl_sched_lock +
    • >>   kv_unlock +
    • >>   kv_lock +
    + +

    tos_knl_sched_lock (Thumb, 88 bytes, Stack size 8 bytes, tos_sys.o(i.tos_knl_sched_lock)) +

    [Stack]

    • Max Depth = 16 + Unknown Stack Size +
    • Call Chain = tos_knl_sched_lock ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    +
    [Called By]
    • >>   timer_update +
    + +

    tos_knl_sched_unlock (Thumb, 90 bytes, Stack size 8 bytes, tos_sys.o(i.tos_knl_sched_unlock)) +

    [Stack]

    • Max Depth = 24 + Unknown Stack Size +
    • Call Chain = tos_knl_sched_unlock ⇒ knl_sched ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   knl_sched +
    • >>   knl_is_sched_locked +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    +
    [Called By]
    • >>   timer_update +
    + +

    tos_knl_start (Thumb, 52 bytes, Stack size 8 bytes, tos_sys.o(i.tos_knl_start)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = tos_knl_start +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   cpu_sched_start +
    • >>   readyqueue_highest_ready_task_get +
    +
    [Called By]
    • >>   osKernelStart +
    + +

    tos_kv_del (Thumb, 68 bytes, Stack size 16 bytes, tos_kv.o(i.tos_kv_del)) +

    [Stack]

    • Max Depth = 216 + Unknown Stack Size +
    • Call Chain = tos_kv_del ⇒ kv_item_find ⇒ kv_item_do_find ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_unlock +
    • >>   kv_lock +
    • >>   kv_item_free +
    • >>   kv_item_find +
    • >>   kv_item_delete +
    • >>   strlen +
    +
    [Called By]
    • >>   task +
    + +

    tos_kv_get (Thumb, 114 bytes, Stack size 32 bytes, tos_kv.o(i.tos_kv_get)) +

    [Stack]

    • Max Depth = 232 + Unknown Stack Size +
    • Call Chain = tos_kv_get ⇒ kv_item_find ⇒ kv_item_do_find ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_unlock +
    • >>   kv_lock +
    • >>   kv_item_free +
    • >>   kv_item_find +
    • >>   strlen +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   task +
    + +

    tos_kv_has_key (Thumb, 52 bytes, Stack size 16 bytes, tos_kv.o(i.tos_kv_has_key)) +

    [Stack]

    • Max Depth = 216 + Unknown Stack Size +
    • Call Chain = tos_kv_has_key ⇒ kv_item_find ⇒ kv_item_do_find ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_unlock +
    • >>   kv_lock +
    • >>   kv_item_find +
    • >>   strlen +
    +
    [Called By]
    • >>   task +
    + +

    tos_kv_init (Thumb, 98 bytes, Stack size 16 bytes, tos_kv.o(i.tos_kv_init)) +

    [Stack]

    • Max Depth = 216 + Unknown Stack Size +
    • Call Chain = tos_kv_init ⇒ kv_mgr_workspace_locate ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_param_verify +
    • >>   kv_mgr_workspace_locate +
    • >>   kv_mgr_ctl_init +
    • >>   kv_mgr_ctl_build +
    • >>   kv_flash_ctl_init +
    • >>   __2printf +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   task +
    + +

    tos_kv_set (Thumb, 100 bytes, Stack size 24 bytes, tos_kv.o(i.tos_kv_set)) +

    [Stack]

    • Max Depth = 328 + Unknown Stack Size +
    • Call Chain = tos_kv_set ⇒ kv_item_update ⇒ kv_item_save ⇒ kv_blk_search_suitable ⇒ kv_gc ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_unlock +
    • >>   kv_lock +
    • >>   kv_item_update +
    • >>   kv_item_save +
    • >>   kv_item_free +
    • >>   kv_item_find +
    • >>   strlen +
    +
    [Called By]
    • >>   task +
    + +

    tos_kv_walkthru (Thumb, 156 bytes, Stack size 24 bytes, tos_kv.o(i.tos_kv_walkthru)) +

    [Stack]

    • Max Depth = 208 + Unknown Stack Size +
    • Call Chain = tos_kv_walkthru ⇒ kv_block_walkthru ⇒ kv_item_body_read ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_block_walkthru +
    • >>   kv_blk_hdr_read +
    • >>   __2printf +
    +
    [Called By]
    • >>   task +
    + +

    tos_mmheap_alloc (Thumb, 38 bytes, Stack size 16 bytes, tos_mmheap.o(i.tos_mmheap_alloc)) +

    [Stack]

    • Max Depth = 128 + Unknown Stack Size +
    • Call Chain = tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   blk_prepare_used +
    • >>   blk_locate_free +
    • >>   adjust_request_size +
    +
    [Called By]
    • >>   kv_mgr_ctl_init +
    • >>   kv_item_walkthru +
    • >>   kv_item_try_delete +
    • >>   kv_item_do_save +
    • >>   kv_item_body_read +
    • >>   kv_block_walkthru +
    + +

    tos_mmheap_free (Thumb, 48 bytes, Stack size 16 bytes, tos_mmheap.o(i.tos_mmheap_free)) +

    [Stack]

    • Max Depth = 104 + Unknown Stack Size +
    • Call Chain = tos_mmheap_free ⇒ blk_merge_prev ⇒ blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   blk_merge_prev +
    • >>   blk_merge_next +
    • >>   blk_mark_as_free +
    • >>   blk_insert +
    +
    [Called By]
    • >>   task_free +
    • >>   kv_item_try_delete +
    • >>   kv_item_is_moved +
    • >>   kv_item_free +
    • >>   kv_item_do_save +
    • >>   kv_item_body_read +
    + +

    tos_mmheap_pool_add (Thumb, 182 bytes, Stack size 24 bytes, tos_mmheap.o(i.tos_mmheap_pool_add)) +

    [Stack]

    • Max Depth = 96 + Unknown Stack Size +
    • Call Chain = tos_mmheap_pool_add ⇒ blk_insert ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   offset_to_blk +
    • >>   mmheap_pool_is_exist +
    • >>   blk_set_used +
    • >>   blk_set_size +
    • >>   blk_set_prev_used +
    • >>   blk_set_prev_free +
    • >>   blk_set_free +
    • >>   blk_link_next +
    • >>   blk_insert +
    +
    [Called By]
    • >>   mmheap_init_with_pool +
    + +

    tos_mutex_create (Thumb, 86 bytes, Stack size 8 bytes, tos_mutex.o(i.tos_mutex_create)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = tos_mutex_create ⇒ pend_object_init +
    +
    [Calls]
    • >>   pend_object_init +
    • >>   knl_is_inirq +
    +
    [Called By]
    • >>   kv_mgr_ctl_init +
    + +

    tos_mutex_pend (Thumb, 18 bytes, Stack size 8 bytes, tos_mutex.o(i.tos_mutex_pend)) +

    [Stack]

    • Max Depth = 136 + Unknown Stack Size +
    • Call Chain = tos_mutex_pend ⇒ tos_mutex_pend_timed ⇒ pend_task_block ⇒ tick_list_add ⇒ tick_task_place ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_mutex_pend_timed +
    +
    [Called By]
    • >>   kv_lock +
    + +

    tos_mutex_pend_timed (Thumb, 288 bytes, Stack size 24 bytes, tos_mutex.o(i.tos_mutex_pend_timed)) +

    [Stack]

    • Max Depth = 128 + Unknown Stack Size +
    • Call Chain = tos_mutex_pend_timed ⇒ pend_task_block ⇒ tick_list_add ⇒ tick_task_place ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   pend_task_block +
    • >>   pend_state2errno +
    • >>   knl_sched +
    • >>   knl_is_sched_locked +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   tos_task_prio_change +
    • >>   knl_is_self +
    • >>   mutex_fresh_owner_mark +
    • >>   knl_object_verify +
    +
    [Called By]
    • >>   tos_mutex_pend +
    + +

    tos_mutex_post (Thumb, 238 bytes, Stack size 32 bytes, tos_mutex.o(i.tos_mutex_post)) +

    [Stack]

    • Max Depth = 112 + Unknown Stack Size +
    • Call Chain = tos_mutex_post ⇒ mutex_old_owner_release ⇒ tos_task_prio_change ⇒ readyqueue_remove ⇒ readyqueue_prio_highest_get ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   pend_is_nopending +
    • >>   knl_sched +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   tos_task_prio_change +
    • >>   pend_wakeup_one +
    • >>   pend_highest_pending_task_get +
    • >>   pend_highest_pending_prio_get +
    • >>   knl_is_self +
    • >>   mutex_old_owner_release +
    • >>   mutex_fresh_owner_mark +
    • >>   knl_object_verify +
    +
    [Called By]
    • >>   kv_unlock +
    + +

    tos_task_create (Thumb, 294 bytes, Stack size 40 bytes, tos_task.o(i.tos_task_create)) +

    [Stack]

    • Max Depth = 72 + Unknown Stack Size +
    • Call Chain = tos_task_create ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   knl_sched +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   cpu_task_stk_init +
    • >>   tos_list_add +
    • >>   task_reset +
    • >>   knl_is_idle +
    • >>   readyqueue_add_tail +
    +
    [Called By]
    • >>   osThreadCreate +
    • >>   knl_idle_init +
    + +

    tos_task_destroy (Thumb, 112 bytes, Stack size 8 bytes, tos_task.o(i.tos_task_destroy)) +

    [Stack]

    • Max Depth = 128 + Unknown Stack Size +
    • Call Chain = tos_task_destroy ⇒ task_do_destroy ⇒ task_mutex_release ⇒ mutex_release ⇒ pend_wakeup_all ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   knl_is_sched_locked +
    • >>   knl_is_inirq +
    • >>   knl_is_self +
    • >>   task_do_destroy +
    • >>   knl_object_verify +
    +
    [Called By]
    • >>   task_exit +
    + +

    tos_task_prio_change (Thumb, 248 bytes, Stack size 24 bytes, tos_task.o(i.tos_task_prio_change)) +

    [Stack]

    • Max Depth = 64 + Unknown Stack Size +
    • Call Chain = tos_task_prio_change ⇒ readyqueue_remove ⇒ readyqueue_prio_highest_get ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   knl_sched +
    • >>   knl_is_inirq +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   readyqueue_remove +
    • >>   pend_list_adjust +
    • >>   knl_is_self +
    • >>   tos_list_empty +
    • >>   task_state_is_ready +
    • >>   task_highest_pending_prio_get +
    • >>   knl_object_verify +
    • >>   readyqueue_add_tail +
    • >>   readyqueue_add_head +
    +
    [Called By]
    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    • >>   mutex_old_owner_release +
    + +

    tos_tick_handler (Thumb, 34 bytes, Stack size 8 bytes, tos_tick.o(i.tos_tick_handler)) +

    [Stack]

    • Max Depth = 96 + Unknown Stack Size +
    • Call Chain = tos_tick_handler ⇒ tick_update ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   timer_update +
    • >>   tick_update +
    +
    [Called By]
    • >>   SysTick_Handler +
    +

    +

    +Local Symbols +

    +

    UART_DMAAbortOnError (Thumb, 24 bytes, Stack size 16 bytes, stm32l4xx_hal_uart.o(i.UART_DMAAbortOnError)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = UART_DMAAbortOnError +
    +
    [Calls]
    • >>   HAL_UART_ErrorCallback +
    +
    [Address Reference Count : 1]
    • stm32l4xx_hal_uart.o(i.HAL_UART_IRQHandler) +
    +

    UART_EndRxTransfer (Thumb, 36 bytes, Stack size 0 bytes, stm32l4xx_hal_uart.o(i.UART_EndRxTransfer)) +

    [Called By]

    • >>   HAL_UART_IRQHandler +
    + +

    UART_EndTransmit_IT (Thumb, 34 bytes, Stack size 8 bytes, stm32l4xx_hal_uart.o(i.UART_EndTransmit_IT)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = UART_EndTransmit_IT +
    +
    [Calls]
    • >>   HAL_UART_TxCpltCallback +
    +
    [Called By]
    • >>   HAL_UART_IRQHandler +
    + +

    RCC_SetFlashLatencyFromMSIRange (Thumb, 148 bytes, Stack size 24 bytes, stm32l4xx_hal_rcc.o(i.RCC_SetFlashLatencyFromMSIRange)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = RCC_SetFlashLatencyFromMSIRange +
    +
    [Calls]
    • >>   HAL_PWREx_GetVoltageRange +
    +
    [Called By]
    • >>   HAL_RCC_OscConfig +
    + +

    RCCEx_PLLSAI1_Config (Thumb, 376 bytes, Stack size 24 bytes, stm32l4xx_hal_rcc_ex.o(i.RCCEx_PLLSAI1_Config)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = RCCEx_PLLSAI1_Config +
    +
    [Calls]
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   HAL_RCCEx_PeriphCLKConfig +
    + +

    __NVIC_GetPriorityGrouping (Thumb, 10 bytes, Stack size 0 bytes, stm32l4xx_hal_cortex.o(i.__NVIC_GetPriorityGrouping)) +

    [Called By]

    • >>   HAL_NVIC_SetPriority +
    + +

    __NVIC_SetPriority (Thumb, 32 bytes, Stack size 8 bytes, stm32l4xx_hal_cortex.o(i.__NVIC_SetPriority)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = __NVIC_SetPriority +
    +
    [Called By]
    • >>   HAL_NVIC_SetPriority +
    • >>   HAL_SYSTICK_Config +
    + +

    QSPI_Config (Thumb, 488 bytes, Stack size 8 bytes, stm32l4xx_hal_qspi.o(i.QSPI_Config)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = QSPI_Config +
    +
    [Called By]
    • >>   HAL_QSPI_Command +
    + +

    QSPI_WaitFlagStateUntilTimeout (Thumb, 76 bytes, Stack size 24 bytes, stm32l4xx_hal_qspi.o(i.QSPI_WaitFlagStateUntilTimeout)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   HAL_QSPI_Init +
    • >>   HAL_QSPI_Transmit +
    • >>   HAL_QSPI_Receive +
    • >>   HAL_QSPI_Command +
    + +

    prv_spi_flash_wait_write_end (Thumb, 52 bytes, Stack size 24 bytes, hal_qspi_flash_1.o(i.prv_spi_flash_wait_write_end)) +

    [Stack]

    • Max Depth = 168
    • Call Chain = prv_spi_flash_wait_write_end ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   QSPI_Send_CMD +
    • >>   QSPI_Receive +
    +
    [Called By]
    • >>   prv_spi_flash_erase_sector +
    • >>   prv_spi_flash_write_page +
    + +

    prv_spi_flash_write_enable (Thumb, 26 bytes, Stack size 16 bytes, hal_qspi_flash_1.o(i.prv_spi_flash_write_enable)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = prv_spi_flash_write_enable ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   QSPI_Send_CMD +
    +
    [Called By]
    • >>   prv_spi_flash_erase_sector +
    • >>   prv_spi_flash_write_page +
    + +

    prv_spi_flash_write_page (Thumb, 62 bytes, Stack size 32 bytes, hal_qspi_flash_1.o(i.prv_spi_flash_write_page)) +

    [Stack]

    • Max Depth = 200
    • Call Chain = prv_spi_flash_write_page ⇒ prv_spi_flash_wait_write_end ⇒ QSPI_Send_CMD ⇒ HAL_QSPI_Command ⇒ QSPI_WaitFlagStateUntilTimeout +
    +
    [Calls]
    • >>   QSPI_Transmit +
    • >>   QSPI_Send_CMD +
    • >>   prv_spi_flash_write_enable +
    • >>   prv_spi_flash_wait_write_end +
    +
    [Called By]
    • >>   hal_spi_flash_write +
    + +

    DHT11_Mode_Out_PP (Thumb, 30 bytes, Stack size 24 bytes, dht11_bus.o(i.DHT11_Mode_Out_PP)) +

    [Stack]

    • Max Depth = 44
    • Call Chain = DHT11_Mode_Out_PP ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_GPIO_Init +
    +
    [Called By]
    • >>   DHT11_Init +
    + +

    __ffs (Thumb, 20 bytes, Stack size 8 bytes, tos_mmheap.o(i.__ffs)) +

    [Stack]

    • Max Depth = 24 + Unknown Stack Size +
    • Call Chain = __ffs ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   generic_fls +
    +
    [Called By]
    • >>   blk_search_suitable +
    + +

    __fls (Thumb, 14 bytes, Stack size 8 bytes, tos_mmheap.o(i.__fls)) +

    [Stack]

    • Max Depth = 24 + Unknown Stack Size +
    • Call Chain = __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   generic_fls +
    +
    [Called By]
    • >>   mapping_search +
    • >>   mapping_insert +
    + +

    adjust_request_size (Thumb, 46 bytes, Stack size 8 bytes, tos_mmheap.o(i.adjust_request_size)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = adjust_request_size +
    +
    [Called By]
    • >>   tos_mmheap_alloc +
    + +

    blk_absorb (Thumb, 30 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_absorb)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = blk_absorb ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   blk_size +
    • >>   blk_link_next +
    +
    [Called By]
    • >>   blk_merge_prev +
    • >>   blk_merge_next +
    + +

    blk_can_split (Thumb, 28 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_can_split)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = blk_can_split +
    +
    [Calls]
    • >>   blk_size +
    +
    [Called By]
    • >>   blk_trim_free +
    + +

    blk_insert (Thumb, 32 bytes, Stack size 24 bytes, tos_mmheap.o(i.blk_insert)) +

    [Stack]

    • Max Depth = 72 + Unknown Stack Size +
    • Call Chain = blk_insert ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   mapping_insert +
    • >>   insert_free_block +
    • >>   blk_size +
    +
    [Called By]
    • >>   tos_mmheap_free +
    • >>   tos_mmheap_pool_add +
    • >>   blk_trim_free +
    + +

    blk_link_next (Thumb, 18 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_link_next)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   blk_next +
    +
    [Called By]
    • >>   tos_mmheap_pool_add +
    • >>   blk_trim_free +
    • >>   blk_mark_as_free +
    • >>   blk_absorb +
    + +

    blk_locate_free (Thumb, 58 bytes, Stack size 24 bytes, tos_mmheap.o(i.blk_locate_free)) +

    [Stack]

    • Max Depth = 96 + Unknown Stack Size +
    • Call Chain = blk_locate_free ⇒ mapping_search ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   remove_free_block +
    • >>   mapping_search +
    • >>   blk_search_suitable +
    +
    [Called By]
    • >>   tos_mmheap_alloc +
    + +

    blk_mark_as_free (Thumb, 26 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_mark_as_free)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   blk_set_prev_free +
    • >>   blk_set_free +
    • >>   blk_link_next +
    +
    [Called By]
    • >>   tos_mmheap_free +
    • >>   blk_split +
    + +

    blk_mark_as_used (Thumb, 26 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_mark_as_used)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = blk_mark_as_used ⇒ blk_next +
    +
    [Calls]
    • >>   blk_set_used +
    • >>   blk_set_prev_used +
    • >>   blk_next +
    +
    [Called By]
    • >>   blk_prepare_used +
    + +

    blk_merge_next (Thumb, 42 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_merge_next)) +

    [Stack]

    • Max Depth = 88 + Unknown Stack Size +
    • Call Chain = blk_merge_next ⇒ blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   blk_remove +
    • >>   blk_next +
    • >>   blk_absorb +
    +
    [Called By]
    • >>   tos_mmheap_free +
    + +

    blk_merge_prev (Thumb, 40 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_merge_prev)) +

    [Stack]

    • Max Depth = 88 + Unknown Stack Size +
    • Call Chain = blk_merge_prev ⇒ blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   blk_remove +
    • >>   blk_absorb +
    +
    [Called By]
    • >>   tos_mmheap_free +
    + +

    blk_next (Thumb, 36 bytes, Stack size 24 bytes, tos_mmheap.o(i.blk_next)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = blk_next +
    +
    [Calls]
    • >>   offset_to_blk +
    • >>   blk_to_ptr +
    • >>   blk_size +
    +
    [Called By]
    • >>   blk_merge_next +
    • >>   blk_mark_as_used +
    • >>   blk_link_next +
    + +

    blk_prepare_used (Thumb, 34 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_prepare_used)) +

    [Stack]

    • Max Depth = 112 + Unknown Stack Size +
    • Call Chain = blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   blk_trim_free +
    • >>   blk_to_ptr +
    • >>   blk_mark_as_used +
    +
    [Called By]
    • >>   tos_mmheap_alloc +
    + +

    blk_remove (Thumb, 32 bytes, Stack size 24 bytes, tos_mmheap.o(i.blk_remove)) +

    [Stack]

    • Max Depth = 72 + Unknown Stack Size +
    • Call Chain = blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   remove_free_block +
    • >>   mapping_insert +
    • >>   blk_size +
    +
    [Called By]
    • >>   blk_merge_prev +
    • >>   blk_merge_next +
    + +

    blk_search_suitable (Thumb, 104 bytes, Stack size 32 bytes, tos_mmheap.o(i.blk_search_suitable)) +

    [Stack]

    • Max Depth = 56 + Unknown Stack Size +
    • Call Chain = blk_search_suitable ⇒ __ffs ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   __ffs +
    +
    [Called By]
    • >>   blk_locate_free +
    + +

    blk_set_free (Thumb, 10 bytes, Stack size 0 bytes, tos_mmheap.o(i.blk_set_free)) +

    [Called By]

    • >>   tos_mmheap_pool_add +
    • >>   blk_mark_as_free +
    + +

    blk_set_prev_free (Thumb, 10 bytes, Stack size 0 bytes, tos_mmheap.o(i.blk_set_prev_free)) +

    [Called By]

    • >>   tos_mmheap_pool_add +
    • >>   blk_trim_free +
    • >>   blk_mark_as_free +
    + +

    blk_set_prev_used (Thumb, 10 bytes, Stack size 0 bytes, tos_mmheap.o(i.blk_set_prev_used)) +

    [Called By]

    • >>   tos_mmheap_pool_add +
    • >>   blk_mark_as_used +
    + +

    blk_set_size (Thumb, 12 bytes, Stack size 0 bytes, tos_mmheap.o(i.blk_set_size)) +

    [Called By]

    • >>   tos_mmheap_pool_add +
    • >>   blk_split +
    + +

    blk_set_used (Thumb, 10 bytes, Stack size 0 bytes, tos_mmheap.o(i.blk_set_used)) +

    [Called By]

    • >>   tos_mmheap_pool_add +
    • >>   blk_mark_as_used +
    + +

    blk_size (Thumb, 10 bytes, Stack size 0 bytes, tos_mmheap.o(i.blk_size)) +

    [Called By]

    • >>   blk_split +
    • >>   blk_remove +
    • >>   blk_next +
    • >>   blk_insert +
    • >>   blk_can_split +
    • >>   blk_absorb +
    + +

    blk_split (Thumb, 62 bytes, Stack size 24 bytes, tos_mmheap.o(i.blk_split)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   offset_to_blk +
    • >>   blk_to_ptr +
    • >>   blk_size +
    • >>   blk_set_size +
    • >>   blk_mark_as_free +
    +
    [Called By]
    • >>   blk_trim_free +
    + +

    blk_to_ptr (Thumb, 8 bytes, Stack size 0 bytes, tos_mmheap.o(i.blk_to_ptr)) +

    [Called By]

    • >>   blk_split +
    • >>   blk_prepare_used +
    • >>   blk_next +
    + +

    blk_trim_free (Thumb, 46 bytes, Stack size 16 bytes, tos_mmheap.o(i.blk_trim_free)) +

    [Stack]

    • Max Depth = 96 + Unknown Stack Size +
    • Call Chain = blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   blk_split +
    • >>   blk_set_prev_free +
    • >>   blk_link_next +
    • >>   blk_insert +
    • >>   blk_can_split +
    +
    [Called By]
    • >>   blk_prepare_used +
    + +

    generic_fls (Thumb, 16 bytes, Stack size 8 bytes, tos_mmheap.o(i.generic_fls)) +

    [Stack]

    • Max Depth = 16 + Unknown Stack Size +
    • Call Chain = generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_cpu_clz +
    +
    [Called By]
    • >>   __fls +
    • >>   __ffs +
    + +

    insert_free_block (Thumb, 74 bytes, Stack size 12 bytes, tos_mmheap.o(i.insert_free_block)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = insert_free_block +
    +
    [Called By]
    • >>   blk_insert +
    + +

    mapping_insert (Thumb, 58 bytes, Stack size 24 bytes, tos_mmheap.o(i.mapping_insert)) +

    [Stack]

    • Max Depth = 48 + Unknown Stack Size +
    • Call Chain = mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   __fls +
    +
    [Called By]
    • >>   mapping_search +
    • >>   blk_remove +
    • >>   blk_insert +
    + +

    mapping_search (Thumb, 46 bytes, Stack size 24 bytes, tos_mmheap.o(i.mapping_search)) +

    [Stack]

    • Max Depth = 72 + Unknown Stack Size +
    • Call Chain = mapping_search ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   mapping_insert +
    • >>   __fls +
    +
    [Called By]
    • >>   blk_locate_free +
    + +

    mmheap_ctl_init (Thumb, 88 bytes, Stack size 0 bytes, tos_mmheap.o(i.mmheap_ctl_init)) +

    [Called By]

    • >>   mmheap_init_with_pool +
    + +

    mmheap_pool_is_exist (Thumb, 38 bytes, Stack size 0 bytes, tos_mmheap.o(i.mmheap_pool_is_exist)) +

    [Called By]

    • >>   tos_mmheap_pool_add +
    + +

    offset_to_blk (Thumb, 6 bytes, Stack size 0 bytes, tos_mmheap.o(i.offset_to_blk)) +

    [Called By]

    • >>   tos_mmheap_pool_add +
    • >>   blk_split +
    • >>   blk_next +
    + +

    remove_free_block (Thumb, 92 bytes, Stack size 16 bytes, tos_mmheap.o(i.remove_free_block)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = remove_free_block +
    +
    [Called By]
    • >>   blk_remove +
    • >>   blk_locate_free +
    + +

    knl_object_verify (Thumb, 16 bytes, Stack size 0 bytes, tos_mutex.o(i.knl_object_verify)) +

    [Called By]

    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    + +

    mutex_fresh_owner_mark (Thumb, 40 bytes, Stack size 8 bytes, tos_mutex.o(i.mutex_fresh_owner_mark)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = mutex_fresh_owner_mark +
    +
    [Called By]
    • >>   tos_mutex_post +
    • >>   tos_mutex_pend_timed +
    + +

    mutex_old_owner_release (Thumb, 74 bytes, Stack size 16 bytes, tos_mutex.o(i.mutex_old_owner_release)) +

    [Stack]

    • Max Depth = 80 + Unknown Stack Size +
    • Call Chain = mutex_old_owner_release ⇒ tos_task_prio_change ⇒ readyqueue_remove ⇒ readyqueue_prio_highest_get ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_task_prio_change +
    +
    [Called By]
    • >>   tos_mutex_post +
    • >>   mutex_release +
    + +

    pend_list_add (Thumb, 68 bytes, Stack size 16 bytes, tos_pend.o(i.pend_list_add)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = pend_list_add +
    +
    [Called By]
    • >>   pend_task_block +
    • >>   pend_list_adjust +
    + +

    tos_list_del (Thumb, 12 bytes, Stack size 0 bytes, tos_pend.o(i.tos_list_del)) +

    [Called By]

    • >>   pend_list_remove +
    • >>   pend_list_adjust +
    + +

    tos_list_empty (Thumb, 16 bytes, Stack size 0 bytes, tos_pend.o(i.tos_list_empty)) +

    [Called By]

    • >>   pend_is_nopending +
    • >>   pend_highest_pending_prio_get +
    + +

    tos_list_init (Thumb, 6 bytes, Stack size 0 bytes, tos_pend.o(i.tos_list_init)) +

    [Called By]

    • >>   pend_object_init +
    + +

    _list_add (Thumb, 10 bytes, Stack size 0 bytes, tos_sched.o(i._list_add)) +

    [Called By]

    • >>   readyqueue_add_head +
    • >>   tos_list_add_tail +
    + +

    _list_del (Thumb, 6 bytes, Stack size 0 bytes, tos_sched.o(i._list_del)) +

    [Called By]

    • >>   readyqueue_remove +
    + +

    readyqueue_prio_highest_get (Thumb, 36 bytes, Stack size 16 bytes, tos_sched.o(i.readyqueue_prio_highest_get)) +

    [Stack]

    • Max Depth = 24 + Unknown Stack Size +
    • Call Chain = readyqueue_prio_highest_get ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_cpu_clz +
    +
    [Called By]
    • >>   readyqueue_remove +
    + +

    readyqueue_prio_mark (Thumb, 56 bytes, Stack size 0 bytes, tos_sched.o(i.readyqueue_prio_mark)) +

    [Called By]

    • >>   readyqueue_add_tail +
    • >>   readyqueue_add_head +
    + +

    tos_list_add_tail (Thumb, 18 bytes, Stack size 16 bytes, tos_sched.o(i.tos_list_add_tail)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = tos_list_add_tail +
    +
    [Calls]
    • >>   _list_add +
    +
    [Called By]
    • >>   readyqueue_add_tail +
    + +

    tos_list_empty (Thumb, 16 bytes, Stack size 0 bytes, tos_sched.o(i.tos_list_empty)) +

    [Called By]

    • >>   readyqueue_remove +
    • >>   readyqueue_add_tail +
    • >>   readyqueue_add_head +
    + +

    knl_idle_entry (Thumb, 10 bytes, Stack size 0 bytes, tos_sys.o(i.knl_idle_entry)) +

    [Stack]

    • Max Depth = 136 + Unknown Stack Size +
    • Call Chain = knl_idle_entry ⇒ task_free_all ⇒ task_free ⇒ tos_mmheap_free ⇒ blk_merge_prev ⇒ blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   task_free_all +
    +
    [Address Reference Count : 1]
    • tos_sys.o(i.knl_idle_init) +
    +

    knl_object_verify (Thumb, 16 bytes, Stack size 0 bytes, tos_task.o(i.knl_object_verify)) +

    [Called By]

    • >>   tos_task_prio_change +
    • >>   tos_task_destroy +
    + +

    task_do_destroy (Thumb, 132 bytes, Stack size 16 bytes, tos_task.o(i.task_do_destroy)) +

    [Stack]

    • Max Depth = 120 + Unknown Stack Size +
    • Call Chain = task_do_destroy ⇒ task_mutex_release ⇒ mutex_release ⇒ pend_wakeup_all ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   knl_sched +
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   tick_list_remove +
    • >>   readyqueue_remove +
    • >>   pend_list_remove +
    • >>   tos_list_empty +
    • >>   tos_list_del +
    • >>   task_state_is_ready +
    • >>   task_reset +
    • >>   task_mutex_release +
    • >>   knl_is_idle +
    +
    [Called By]
    • >>   tos_task_destroy +
    + +

    task_exit (Thumb, 10 bytes, Stack size 8 bytes, tos_task.o(i.task_exit)) +

    [Stack]

    • Max Depth = 136 + Unknown Stack Size +
    • Call Chain = task_exit ⇒ tos_task_destroy ⇒ task_do_destroy ⇒ task_mutex_release ⇒ mutex_release ⇒ pend_wakeup_all ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   tos_task_destroy +
    +
    [Address Reference Count : 1]
    • tos_task.o(i.tos_task_create) +
    +

    task_free (Thumb, 18 bytes, Stack size 8 bytes, tos_task.o(i.task_free)) +

    [Stack]

    • Max Depth = 112 + Unknown Stack Size +
    • Call Chain = task_free ⇒ tos_mmheap_free ⇒ blk_merge_prev ⇒ blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_mmheap_free +
    +
    [Called By]
    • >>   task_free_all +
    + +

    task_highest_pending_prio_get (Thumb, 48 bytes, Stack size 24 bytes, tos_task.o(i.task_highest_pending_prio_get)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = task_highest_pending_prio_get ⇒ pend_highest_pending_prio_get +
    +
    [Calls]
    • >>   pend_highest_pending_prio_get +
    +
    [Called By]
    • >>   tos_task_prio_change +
    + +

    task_mutex_release (Thumb, 32 bytes, Stack size 16 bytes, tos_task.o(i.task_mutex_release)) +

    [Stack]

    • Max Depth = 104 + Unknown Stack Size +
    • Call Chain = task_mutex_release ⇒ mutex_release ⇒ pend_wakeup_all ⇒ pend_task_wakeup ⇒ readyqueue_add ⇒ readyqueue_add_tail ⇒ tos_list_add_tail +
    +
    [Calls]
    • >>   mutex_release +
    +
    [Called By]
    • >>   task_do_destroy +
    + +

    task_reset (Thumb, 80 bytes, Stack size 8 bytes, tos_task.o(i.task_reset)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = task_reset +
    +
    [Calls]
    • >>   tos_list_init +
    +
    [Called By]
    • >>   task_do_destroy +
    • >>   tos_task_create +
    + +

    task_state_is_ready (Thumb, 14 bytes, Stack size 0 bytes, tos_task.o(i.task_state_is_ready)) +

    [Called By]

    • >>   tos_task_prio_change +
    • >>   task_do_destroy +
    + +

    tos_list_add (Thumb, 14 bytes, Stack size 0 bytes, tos_task.o(i.tos_list_add)) +

    [Called By]

    • >>   tos_task_create +
    + +

    tos_list_del (Thumb, 12 bytes, Stack size 0 bytes, tos_task.o(i.tos_list_del)) +

    [Called By]

    • >>   task_do_destroy +
    • >>   task_free_all +
    + +

    tos_list_empty (Thumb, 16 bytes, Stack size 0 bytes, tos_task.o(i.tos_list_empty)) +

    [Called By]

    • >>   tos_task_prio_change +
    • >>   task_do_destroy +
    + +

    tos_list_init (Thumb, 6 bytes, Stack size 0 bytes, tos_task.o(i.tos_list_init)) +

    [Called By]

    • >>   task_reset +
    + +

    tick_task_place (Thumb, 184 bytes, Stack size 56 bytes, tos_tick.o(i.tick_task_place)) +

    [Stack]

    • Max Depth = 64 + Unknown Stack Size +
    • Call Chain = tick_task_place ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    +
    [Called By]
    • >>   tick_list_add +
    + +

    tick_task_takeoff (Thumb, 126 bytes, Stack size 16 bytes, tos_tick.o(i.tick_task_takeoff)) +

    [Stack]

    • Max Depth = 24 + Unknown Stack Size +
    • Call Chain = tick_task_takeoff ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    • >>   tos_list_empty +
    +
    [Called By]
    • >>   tick_list_remove +
    + +

    tos_list_empty (Thumb, 16 bytes, Stack size 0 bytes, tos_tick.o(i.tos_list_empty)) +

    [Called By]

    • >>   tick_task_takeoff +
    • >>   tick_update +
    + +

    timer_place (Thumb, 130 bytes, Stack size 24 bytes, tos_timer.o(i.timer_place)) +

    [Stack]

    • Max Depth = 32 + Unknown Stack Size +
    • Call Chain = timer_place ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    +
    [Called By]
    • >>   timer_update +
    + +

    timer_takeoff (Thumb, 110 bytes, Stack size 24 bytes, tos_timer.o(i.timer_takeoff)) +

    [Stack]

    • Max Depth = 32 + Unknown Stack Size +
    • Call Chain = timer_takeoff ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_cpu_cpsr_save +
    • >>   tos_cpu_cpsr_restore +
    +
    [Called By]
    • >>   timer_update +
    + +

    __NVIC_SetPriority (Thumb, 32 bytes, Stack size 8 bytes, port_c.o(i.__NVIC_SetPriority)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = __NVIC_SetPriority +
    +
    [Called By]
    • >>   port_systick_priority_set +
    • >>   port_systick_config +
    + +

    errno_knl2cmsis (Thumb, 12 bytes, Stack size 0 bytes, cmsis_os.o(i.errno_knl2cmsis)) +

    [Called By]

    • >>   osKernelStart +
    • >>   osKernelInitialize +
    + +

    priority_cmsis2knl (Thumb, 18 bytes, Stack size 0 bytes, cmsis_os.o(i.priority_cmsis2knl)) +

    [Called By]

    • >>   osThreadCreate +
    + +

    kv_blk_flags_add (Thumb, 58 bytes, Stack size 12 bytes, tos_kv.o(i.kv_blk_flags_add)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = kv_blk_flags_add +
    +
    [Called By]
    • >>   kv_mgr_ctl_build +
    • >>   kv_blk_set_inuse +
    • >>   kv_blk_set_dirty +
    + +

    kv_blk_flags_get (Thumb, 30 bytes, Stack size 0 bytes, tos_kv.o(i.kv_blk_flags_get)) +

    [Called By]

    • >>   kv_gc +
    • >>   kv_blk_is_inuse +
    • >>   kv_blk_is_hanging +
    • >>   kv_blk_is_fresh +
    • >>   kv_blk_is_bad +
    + +

    kv_blk_flags_rmv (Thumb, 58 bytes, Stack size 12 bytes, tos_kv.o(i.kv_blk_flags_rmv)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = kv_blk_flags_rmv +
    +
    [Called By]
    • >>   kv_mgr_blk_index_rebuild +
    • >>   kv_blk_reset_inuse +
    • >>   kv_blk_reset_fresh +
    + +

    kv_blk_flags_set (Thumb, 30 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_flags_set)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_blk_flags_set +
    +
    [Called By]
    • >>   kv_blk_set_fresh +
    • >>   kv_blk_set_bad +
    + +

    kv_blk_format (Thumb, 42 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_format)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = kv_blk_format ⇒ kv_flash_wunit_modify ⇒ kv_flash_write +
    +
    [Calls]
    • >>   kv_flash_wunit_modify +
    • >>   kv_flash_blk_erase +
    • >>   kv_blk_set_fresh +
    +
    [Called By]
    • >>   kv_mgr_ctl_build +
    • >>   kv_gc +
    + +

    kv_blk_freesz_get (Thumb, 32 bytes, Stack size 0 bytes, tos_kv.o(i.kv_blk_freesz_get)) +

    [Called By]

    • >>   kv_item_save +
    • >>   kv_item_do_gc +
    • >>   kv_blk_search_suitable +
    • >>   kv_blk_search_inuse +
    • >>   kv_blk_is_full +
    • >>   kv_blk_freesz_reduce +
    + +

    kv_blk_freesz_reduce (Thumb, 24 bytes, Stack size 16 bytes, tos_kv.o(i.kv_blk_freesz_reduce)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = kv_blk_freesz_reduce ⇒ kv_blk_freesz_set +
    +
    [Calls]
    • >>   kv_blk_freesz_set +
    • >>   kv_blk_freesz_get +
    +
    [Called By]
    • >>   kv_item_save +
    • >>   kv_item_do_gc +
    + +

    kv_blk_freesz_set (Thumb, 32 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_freesz_set)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_blk_freesz_set +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_blk_set_fresh +
    • >>   kv_blk_freesz_reduce +
    + +

    kv_blk_hdr_read (Thumb, 18 bytes, Stack size 16 bytes, tos_kv.o(i.kv_blk_hdr_read)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = kv_blk_hdr_read ⇒ kv_flash_read +
    +
    [Calls]
    • >>   kv_flash_read +
    +
    [Called By]
    • >>   tos_kv_walkthru +
    • >>   kv_mgr_ctl_build +
    + +

    kv_blk_is_bad (Thumb, 16 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_is_bad)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_blk_is_bad +
    +
    [Calls]
    • >>   kv_blk_flags_get +
    +
    [Called By]
    • >>   kv_item_find_new_copy +
    • >>   kv_item_find +
    + +

    kv_blk_is_fresh (Thumb, 16 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_is_fresh)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_blk_is_fresh +
    +
    [Calls]
    • >>   kv_blk_flags_get +
    +
    [Called By]
    • >>   kv_mgr_workspace_locate +
    • >>   kv_item_save +
    • >>   kv_item_find_new_copy +
    • >>   kv_item_find +
    • >>   kv_blk_set_fresh +
    • >>   kv_blk_reset_fresh +
    • >>   kv_blk_next_fresh +
    + +

    kv_blk_is_full (Thumb, 38 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_is_full)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_blk_is_full +
    +
    [Calls]
    • >>   kv_blk_freesz_get +
    +
    [Called By]
    • >>   kv_item_save +
    • >>   kv_gc +
    + +

    kv_blk_is_hanging (Thumb, 16 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_is_hanging)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_blk_is_hanging +
    +
    [Calls]
    • >>   kv_blk_flags_get +
    +
    [Called By]
    • >>   kv_mgr_ctl_build +
    • >>   kv_mgr_blk_index_rebuild +
    + +

    kv_blk_is_inuse (Thumb, 16 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_is_inuse)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_blk_is_inuse +
    +
    [Calls]
    • >>   kv_blk_flags_get +
    +
    [Called By]
    • >>   kv_mgr_workspace_locate +
    • >>   kv_blk_set_inuse +
    • >>   kv_blk_search_inuse +
    • >>   kv_blk_reset_inuse +
    + +

    kv_blk_next_fresh (Thumb, 118 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_next_fresh)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = kv_blk_next_fresh ⇒ kv_blk_is_fresh +
    +
    [Calls]
    • >>   kv_blk_is_fresh +
    +
    [Called By]
    • >>   kv_gc +
    • >>   kv_blk_search_suitable +
    + +

    kv_blk_reset_fresh (Thumb, 34 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_reset_fresh)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = kv_blk_reset_fresh ⇒ kv_blk_flags_rmv +
    +
    [Calls]
    • >>   kv_blk_is_fresh +
    • >>   kv_blk_flags_rmv +
    +
    [Called By]
    • >>   kv_item_save +
    • >>   kv_gc +
    + +

    kv_blk_reset_inuse (Thumb, 34 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_reset_inuse)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = kv_blk_reset_inuse ⇒ kv_blk_flags_rmv +
    +
    [Calls]
    • >>   kv_blk_is_inuse +
    • >>   kv_blk_flags_rmv +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_item_save +
    • >>   kv_gc +
    + +

    kv_blk_search_inuse (Thumb, 130 bytes, Stack size 16 bytes, tos_kv.o(i.kv_blk_search_inuse)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = kv_blk_search_inuse ⇒ kv_blk_is_inuse +
    +
    [Calls]
    • >>   kv_blk_is_inuse +
    • >>   kv_blk_freesz_get +
    +
    [Called By]
    • >>   kv_blk_search_suitable +
    + +

    kv_blk_search_suitable (Thumb, 150 bytes, Stack size 16 bytes, tos_kv.o(i.kv_blk_search_suitable)) +

    [Stack]

    • Max Depth = 232 + Unknown Stack Size +
    • Call Chain = kv_blk_search_suitable ⇒ kv_gc ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_gc +
    • >>   kv_blk_search_inuse +
    • >>   kv_blk_next_fresh +
    • >>   kv_blk_freesz_get +
    +
    [Called By]
    • >>   kv_item_save +
    + +

    kv_blk_set_bad (Thumb, 14 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_set_bad)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = kv_blk_set_bad ⇒ kv_blk_flags_set +
    +
    [Calls]
    • >>   kv_blk_flags_set +
    +
    [Called By]
    • >>   kv_mgr_ctl_build +
    • >>   kv_gc +
    + +

    kv_blk_set_dirty (Thumb, 14 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_set_dirty)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = kv_blk_set_dirty ⇒ kv_blk_flags_add +
    +
    [Calls]
    • >>   kv_blk_flags_add +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_item_delete_aux +
    + +

    kv_blk_set_fresh (Thumb, 64 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_set_fresh)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = kv_blk_set_fresh ⇒ kv_blk_is_fresh +
    +
    [Calls]
    • >>   kv_blk_is_fresh +
    • >>   kv_blk_freesz_set +
    • >>   kv_blk_flags_set +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_blk_format +
    + +

    kv_blk_set_inuse (Thumb, 34 bytes, Stack size 8 bytes, tos_kv.o(i.kv_blk_set_inuse)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = kv_blk_set_inuse ⇒ kv_blk_flags_add +
    +
    [Calls]
    • >>   kv_blk_is_inuse +
    • >>   kv_blk_flags_add +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_item_save +
    • >>   kv_gc +
    + +

    kv_block_walkthru (Thumb, 666 bytes, Stack size 40 bytes, tos_kv.o(i.kv_block_walkthru)) +

    [Stack]

    • Max Depth = 184 + Unknown Stack Size +
    • Call Chain = kv_block_walkthru ⇒ kv_item_body_read ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_mmheap_alloc +
    • >>   kv_u8_disp +
    • >>   kv_item_hdr_verify +
    • >>   kv_item_hdr_read +
    • >>   kv_item_free +
    • >>   kv_item_body_verify +
    • >>   kv_item_body_read +
    • >>   __2printf +
    +
    [Called By]
    • >>   tos_kv_walkthru +
    + +

    kv_checksum_crc8 (Thumb, 58 bytes, Stack size 12 bytes, tos_kv.o(i.kv_checksum_crc8)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = kv_checksum_crc8 +
    +
    [Called By]
    • >>   kv_item_do_save +
    • >>   kv_item_body_verify +
    + +

    kv_do_gc (Thumb, 18 bytes, Stack size 8 bytes, tos_kv.o(i.kv_do_gc)) +

    [Stack]

    • Max Depth = 176 + Unknown Stack Size +
    • Call Chain = kv_do_gc ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_walkthru +
    +
    [Called By]
    • >>   kv_gc +
    + +

    kv_flash_blk_erase (Thumb, 22 bytes, Stack size 8 bytes, tos_kv.o(i.kv_flash_blk_erase)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = kv_flash_blk_erase ⇒ kv_flash_erase +
    +
    [Calls]
    • >>   kv_flash_erase +
    +
    [Called By]
    • >>   kv_blk_format +
    + +

    kv_flash_ctl_init (Thumb, 78 bytes, Stack size 12 bytes, tos_kv.o(i.kv_flash_ctl_init)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = kv_flash_ctl_init +
    +
    [Called By]
    • >>   tos_kv_init +
    + +

    kv_flash_erase (Thumb, 28 bytes, Stack size 16 bytes, tos_kv.o(i.kv_flash_erase)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = kv_flash_erase +
    +
    [Called By]
    • >>   kv_flash_blk_erase +
    + +

    kv_flash_read (Thumb, 32 bytes, Stack size 16 bytes, tos_kv.o(i.kv_flash_read)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = kv_flash_read +
    +
    [Called By]
    • >>   kv_item_try_delete +
    • >>   kv_item_hdr_read +
    • >>   kv_item_body_read +
    • >>   kv_blk_hdr_read +
    + +

    kv_flash_write (Thumb, 32 bytes, Stack size 16 bytes, tos_kv.o(i.kv_flash_write)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = kv_flash_write +
    +
    [Called By]
    • >>   kv_item_write +
    • >>   kv_item_hdr_write +
    • >>   kv_flash_wunit_modify +
    + +

    kv_flash_wunit_modify (Thumb, 18 bytes, Stack size 24 bytes, tos_kv.o(i.kv_flash_wunit_modify)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = kv_flash_wunit_modify ⇒ kv_flash_write +
    +
    [Calls]
    • >>   kv_flash_write +
    +
    [Called By]
    • >>   kv_item_hdr_write +
    • >>   kv_item_do_delete +
    • >>   kv_blk_format +
    + +

    kv_gc (Thumb, 162 bytes, Stack size 24 bytes, tos_kv.o(i.kv_gc)) +

    [Stack]

    • Max Depth = 216 + Unknown Stack Size +
    • Call Chain = kv_gc ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_mgr_blk_index_rebuild +
    • >>   kv_do_gc +
    • >>   kv_blk_set_inuse +
    • >>   kv_blk_set_bad +
    • >>   kv_blk_reset_inuse +
    • >>   kv_blk_reset_fresh +
    • >>   kv_blk_next_fresh +
    • >>   kv_blk_is_full +
    • >>   kv_blk_format +
    • >>   kv_blk_flags_get +
    +
    [Called By]
    • >>   kv_blk_search_suitable +
    + +

    kv_item_body_read (Thumb, 108 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_body_read)) +

    [Stack]

    • Max Depth = 144 + Unknown Stack Size +
    • Call Chain = kv_item_body_read ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_mmheap_free +
    • >>   tos_mmheap_alloc +
    • >>   kv_flash_read +
    +
    [Called By]
    • >>   kv_item_is_moved +
    • >>   kv_item_do_recovery +
    • >>   kv_item_do_gc +
    • >>   kv_item_do_fetch_new_copy +
    • >>   kv_item_do_fetch +
    • >>   kv_block_walkthru +
    + +

    kv_item_body_verify (Thumb, 30 bytes, Stack size 8 bytes, tos_kv.o(i.kv_item_body_verify)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = kv_item_body_verify ⇒ kv_checksum_crc8 +
    +
    [Calls]
    • >>   kv_checksum_crc8 +
    +
    [Called By]
    • >>   kv_item_do_recovery +
    • >>   kv_block_walkthru +
    + +

    kv_item_delete (Thumb, 12 bytes, Stack size 8 bytes, tos_kv.o(i.kv_item_delete)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = kv_item_delete ⇒ kv_item_delete_aux ⇒ kv_item_do_delete ⇒ kv_flash_wunit_modify ⇒ kv_flash_write +
    +
    [Calls]
    • >>   kv_item_delete_aux +
    +
    [Called By]
    • >>   tos_kv_del +
    • >>   kv_item_update +
    • >>   kv_item_do_recovery +
    + +

    kv_item_delete_aux (Thumb, 56 bytes, Stack size 8 bytes, tos_kv.o(i.kv_item_delete_aux)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = kv_item_delete_aux ⇒ kv_item_do_delete ⇒ kv_flash_wunit_modify ⇒ kv_flash_write +
    +
    [Calls]
    • >>   kv_item_do_delete +
    • >>   kv_blk_set_dirty +
    +
    [Called By]
    • >>   kv_item_try_delete +
    • >>   kv_item_delete +
    + +

    kv_item_do_delete (Thumb, 18 bytes, Stack size 8 bytes, tos_kv.o(i.kv_item_do_delete)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = kv_item_do_delete ⇒ kv_flash_wunit_modify ⇒ kv_flash_write +
    +
    [Calls]
    • >>   kv_flash_wunit_modify +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_item_delete_aux +
    + +

    kv_item_do_fetch (Thumb, 60 bytes, Stack size 24 bytes, tos_kv.o(i.kv_item_do_fetch)) +

    [Stack]

    • Max Depth = 168 + Unknown Stack Size +
    • Call Chain = kv_item_do_fetch ⇒ kv_item_body_read ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_body_read +
    • >>   memcmp +
    • >>   strlen +
    +
    [Address Reference Count : 1]
    • tos_kv.o(i.kv_item_do_find) +
    +

    kv_item_do_fetch_new_copy (Thumb, 76 bytes, Stack size 40 bytes, tos_kv.o(i.kv_item_do_fetch_new_copy)) +

    [Stack]

    • Max Depth = 184 + Unknown Stack Size +
    • Call Chain = kv_item_do_fetch_new_copy ⇒ kv_item_body_read ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_body_read +
    • >>   memcmp +
    +
    [Address Reference Count : 1]
    • tos_kv.o(i.kv_item_do_find_new_copy) +
    +

    kv_item_do_find (Thumb, 28 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_do_find)) +

    [Stack]

    • Max Depth = 184 + Unknown Stack Size +
    • Call Chain = kv_item_do_find ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_walkthru +
    +
    [Called By]
    • >>   kv_item_find +
    + +

    kv_item_do_find_new_copy (Thumb, 28 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_do_find_new_copy)) +

    [Stack]

    • Max Depth = 184 + Unknown Stack Size +
    • Call Chain = kv_item_do_find_new_copy ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_walkthru +
    +
    [Called By]
    • >>   kv_item_find_new_copy +
    + +

    kv_item_do_gc (Thumb, 136 bytes, Stack size 24 bytes, tos_kv.o(i.kv_item_do_gc)) +

    [Stack]

    • Max Depth = 168 + Unknown Stack Size +
    • Call Chain = kv_item_do_gc ⇒ kv_item_body_read ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_write +
    • >>   kv_item_body_read +
    • >>   kv_blk_freesz_reduce +
    • >>   kv_blk_freesz_get +
    +
    [Address Reference Count : 1]
    • tos_kv.o(i.kv_do_gc) +
    +

    kv_item_do_recovery (Thumb, 78 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_do_recovery)) +

    [Stack]

    • Max Depth = 192 + Unknown Stack Size +
    • Call Chain = kv_item_do_recovery ⇒ kv_item_try_delete ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_try_delete +
    • >>   kv_item_delete +
    • >>   kv_item_body_verify +
    • >>   kv_item_body_read +
    +
    [Address Reference Count : 1]
    • tos_kv.o(i.kv_mgr_index_build) +
    +

    kv_item_do_save (Thumb, 152 bytes, Stack size 64 bytes, tos_kv.o(i.kv_item_do_save)) +

    [Stack]

    • Max Depth = 192 + Unknown Stack Size +
    • Call Chain = kv_item_do_save ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_mmheap_free +
    • >>   tos_mmheap_alloc +
    • >>   kv_item_write +
    • >>   kv_checksum_crc8 +
    • >>   strlen +
    • >>   __aeabi_memclr +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   kv_item_save +
    + +

    kv_item_find (Thumb, 74 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_find)) +

    [Stack]

    • Max Depth = 200 + Unknown Stack Size +
    • Call Chain = kv_item_find ⇒ kv_item_do_find ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_do_find +
    • >>   kv_blk_is_fresh +
    • >>   kv_blk_is_bad +
    +
    [Called By]
    • >>   tos_kv_set +
    • >>   tos_kv_has_key +
    • >>   tos_kv_get +
    • >>   tos_kv_del +
    + +

    kv_item_find_new_copy (Thumb, 74 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_find_new_copy)) +

    [Stack]

    • Max Depth = 200 + Unknown Stack Size +
    • Call Chain = kv_item_find_new_copy ⇒ kv_item_do_find_new_copy ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_do_find_new_copy +
    • >>   kv_blk_is_fresh +
    • >>   kv_blk_is_bad +
    +
    [Called By]
    • >>   kv_item_fix +
    + +

    kv_item_fix (Thumb, 32 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_fix)) +

    [Stack]

    • Max Depth = 216 + Unknown Stack Size +
    • Call Chain = kv_item_fix ⇒ kv_item_find_new_copy ⇒ kv_item_do_find_new_copy ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_free +
    • >>   kv_item_find_new_copy +
    +
    [Called By]
    • >>   kv_item_save +
    + +

    kv_item_free (Thumb, 22 bytes, Stack size 8 bytes, tos_kv.o(i.kv_item_free)) +

    [Stack]

    • Max Depth = 112 + Unknown Stack Size +
    • Call Chain = kv_item_free ⇒ tos_mmheap_free ⇒ blk_merge_prev ⇒ blk_remove ⇒ mapping_insert ⇒ __fls ⇒ generic_fls ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_mmheap_free +
    +
    [Called By]
    • >>   tos_kv_set +
    • >>   tos_kv_get +
    • >>   tos_kv_del +
    • >>   kv_item_walkthru +
    • >>   kv_item_fix +
    • >>   kv_block_walkthru +
    + +

    kv_item_hdr_read (Thumb, 18 bytes, Stack size 16 bytes, tos_kv.o(i.kv_item_hdr_read)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = kv_item_hdr_read ⇒ kv_flash_read +
    +
    [Calls]
    • >>   kv_flash_read +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_item_try_delete +
    • >>   kv_item_is_moved +
    • >>   kv_block_walkthru +
    + +

    kv_item_hdr_verify (Thumb, 144 bytes, Stack size 20 bytes, tos_kv.o(i.kv_item_hdr_verify)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = kv_item_hdr_verify +
    +
    [Called By]
    • >>   kv_item_walkthru +
    • >>   kv_block_walkthru +
    + +

    kv_item_hdr_write (Thumb, 62 bytes, Stack size 24 bytes, tos_kv.o(i.kv_item_hdr_write)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = kv_item_hdr_write ⇒ kv_flash_wunit_modify ⇒ kv_flash_write +
    +
    [Calls]
    • >>   kv_flash_wunit_modify +
    • >>   kv_flash_write +
    +
    [Called By]
    • >>   kv_item_write +
    + +

    kv_item_is_moved (Thumb, 90 bytes, Stack size 48 bytes, tos_kv.o(i.kv_item_is_moved)) +

    [Stack]

    • Max Depth = 192 + Unknown Stack Size +
    • Call Chain = kv_item_is_moved ⇒ kv_item_body_read ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_mmheap_free +
    • >>   kv_item_hdr_read +
    • >>   kv_item_body_read +
    • >>   memcmp +
    +
    [Called By]
    • >>   kv_item_save +
    + +

    kv_item_save (Thumb, 208 bytes, Stack size 48 bytes, tos_kv.o(i.kv_item_save)) +

    [Stack]

    • Max Depth = 280 + Unknown Stack Size +
    • Call Chain = kv_item_save ⇒ kv_blk_search_suitable ⇒ kv_gc ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_is_moved +
    • >>   kv_item_fix +
    • >>   kv_item_do_save +
    • >>   kv_blk_set_inuse +
    • >>   kv_blk_search_suitable +
    • >>   kv_blk_reset_inuse +
    • >>   kv_blk_reset_fresh +
    • >>   kv_blk_is_full +
    • >>   kv_blk_is_fresh +
    • >>   kv_blk_freesz_reduce +
    • >>   kv_blk_freesz_get +
    • >>   strlen +
    +
    [Called By]
    • >>   tos_kv_set +
    • >>   kv_item_update +
    + +

    kv_item_try_delete (Thumb, 174 bytes, Stack size 48 bytes, tos_kv.o(i.kv_item_try_delete)) +

    [Stack]

    • Max Depth = 176 + Unknown Stack Size +
    • Call Chain = kv_item_try_delete ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_mmheap_free +
    • >>   tos_mmheap_alloc +
    • >>   kv_item_hdr_read +
    • >>   kv_item_delete_aux +
    • >>   kv_flash_read +
    • >>   memcmp +
    +
    [Called By]
    • >>   kv_item_do_recovery +
    + +

    kv_item_update (Thumb, 58 bytes, Stack size 24 bytes, tos_kv.o(i.kv_item_update)) +

    [Stack]

    • Max Depth = 304 + Unknown Stack Size +
    • Call Chain = kv_item_update ⇒ kv_item_save ⇒ kv_blk_search_suitable ⇒ kv_gc ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_value_is_match +
    • >>   kv_item_save +
    • >>   kv_item_delete +
    +
    [Called By]
    • >>   tos_kv_set +
    + +

    kv_item_value_is_match (Thumb, 50 bytes, Stack size 24 bytes, tos_kv.o(i.kv_item_value_is_match)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = kv_item_value_is_match ⇒ memcmp +
    +
    [Calls]
    • >>   memcmp +
    +
    [Called By]
    • >>   kv_item_update +
    + +

    kv_item_walkthru (Thumb, 486 bytes, Stack size 40 bytes, tos_kv.o(i.kv_item_walkthru)) +

    [Stack]

    • Max Depth = 168 + Unknown Stack Size +
    • Call Chain = kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_mmheap_alloc +
    • >>   kv_item_hdr_verify +
    • >>   kv_item_hdr_read +
    • >>   kv_item_free +
    • >>   kv_item_do_delete +
    • >>   kv_blk_set_inuse +
    • >>   kv_blk_set_fresh +
    • >>   kv_blk_set_dirty +
    • >>   kv_blk_reset_inuse +
    • >>   kv_blk_freesz_set +
    +
    [Called By]
    • >>   kv_mgr_index_build +
    • >>   kv_item_do_find_new_copy +
    • >>   kv_item_do_find +
    • >>   kv_do_gc +
    + +

    kv_item_write (Thumb, 54 bytes, Stack size 24 bytes, tos_kv.o(i.kv_item_write)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = kv_item_write ⇒ kv_item_hdr_write ⇒ kv_flash_wunit_modify ⇒ kv_flash_write +
    +
    [Calls]
    • >>   kv_item_hdr_write +
    • >>   kv_flash_write +
    +
    [Called By]
    • >>   kv_item_do_save +
    • >>   kv_item_do_gc +
    + +

    kv_lock (Thumb, 16 bytes, Stack size 8 bytes, tos_kv.o(i.kv_lock)) +

    [Stack]

    • Max Depth = 144 + Unknown Stack Size +
    • Call Chain = kv_lock ⇒ tos_mutex_pend ⇒ tos_mutex_pend_timed ⇒ pend_task_block ⇒ tick_list_add ⇒ tick_task_place ⇒ tos_cpu_cpsr_save +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   tos_mutex_pend +
    +
    [Called By]
    • >>   tos_kv_set +
    • >>   tos_kv_has_key +
    • >>   tos_kv_get +
    • >>   tos_kv_del +
    + +

    kv_mgr_blk_index_rebuild (Thumb, 88 bytes, Stack size 16 bytes, tos_kv.o(i.kv_mgr_blk_index_rebuild)) +

    [Stack]

    • Max Depth = 192 + Unknown Stack Size +
    • Call Chain = kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_mgr_index_build +
    • >>   kv_blk_is_hanging +
    • >>   kv_blk_flags_rmv +
    +
    [Called By]
    • >>   kv_mgr_workspace_locate +
    • >>   kv_gc +
    + +

    kv_mgr_ctl_build (Thumb, 128 bytes, Stack size 24 bytes, tos_kv.o(i.kv_mgr_ctl_build)) +

    [Stack]

    • Max Depth = 200 + Unknown Stack Size +
    • Call Chain = kv_mgr_ctl_build ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_mgr_index_build +
    • >>   kv_blk_set_bad +
    • >>   kv_blk_is_hanging +
    • >>   kv_blk_hdr_read +
    • >>   kv_blk_format +
    • >>   kv_blk_flags_add +
    +
    [Called By]
    • >>   tos_kv_init +
    + +

    kv_mgr_ctl_init (Thumb, 72 bytes, Stack size 8 bytes, tos_kv.o(i.kv_mgr_ctl_init)) +

    [Stack]

    • Max Depth = 136 + Unknown Stack Size +
    • Call Chain = kv_mgr_ctl_init ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   tos_mmheap_alloc +
    • >>   tos_mutex_create +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   tos_kv_init +
    + +

    kv_mgr_index_build (Thumb, 18 bytes, Stack size 8 bytes, tos_kv.o(i.kv_mgr_index_build)) +

    [Stack]

    • Max Depth = 176 + Unknown Stack Size +
    • Call Chain = kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_item_walkthru +
    +
    [Called By]
    • >>   kv_mgr_ctl_build +
    • >>   kv_mgr_blk_index_rebuild +
    + +

    kv_mgr_workspace_locate (Thumb, 102 bytes, Stack size 8 bytes, tos_kv.o(i.kv_mgr_workspace_locate)) +

    [Stack]

    • Max Depth = 200 + Unknown Stack Size +
    • Call Chain = kv_mgr_workspace_locate ⇒ kv_mgr_blk_index_rebuild ⇒ kv_mgr_index_build ⇒ kv_item_walkthru ⇒ tos_mmheap_alloc ⇒ blk_prepare_used ⇒ blk_trim_free ⇒ blk_split ⇒ blk_mark_as_free ⇒ blk_link_next ⇒ blk_next +
    +
    [Calls]
    • >>   kv_mgr_blk_index_rebuild +
    • >>   kv_blk_is_inuse +
    • >>   kv_blk_is_fresh +
    +
    [Called By]
    • >>   tos_kv_init +
    + +

    kv_param_verify (Thumb, 60 bytes, Stack size 8 bytes, tos_kv.o(i.kv_param_verify)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = kv_param_verify +
    +
    [Called By]
    • >>   tos_kv_init +
    + +

    kv_u8_disp (Thumb, 40 bytes, Stack size 16 bytes, tos_kv.o(i.kv_u8_disp)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = kv_u8_disp ⇒ __2printf +
    +
    [Calls]
    • >>   __2printf +
    +
    [Called By]
    • >>   kv_block_walkthru +
    + +

    kv_unlock (Thumb, 16 bytes, Stack size 8 bytes, tos_kv.o(i.kv_unlock)) +

    [Stack]

    • Max Depth = 120 + Unknown Stack Size +
    • Call Chain = kv_unlock ⇒ tos_mutex_post ⇒ mutex_old_owner_release ⇒ tos_task_prio_change ⇒ readyqueue_remove ⇒ readyqueue_prio_highest_get ⇒ tos_cpu_clz +
    +
    [Calls]
    • >>   tos_knl_is_running +
    • >>   tos_mutex_post +
    +
    [Called By]
    • >>   tos_kv_set +
    • >>   tos_kv_has_key +
    • >>   tos_kv_get +
    • >>   tos_kv_del +
    + +

    _printf_core (Thumb, 658 bytes, Stack size 104 bytes, printf5.o(i._printf_core), UNUSED) +

    [Calls]

    • >>   __aeabi_uldivmod +
    +
    [Called By]
    • >>   __0printf$5 +
    +

    +

    +Undefined Global Symbols +


    diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.sct b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.sct new file mode 100644 index 00000000..66acf7f8 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/obj/TencentOS_tiny.sct @@ -0,0 +1,16 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00040000 { ; load region size_region + ER_IROM1 0x08000000 0x00040000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00010000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/startup_stm32l431xx.s b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/startup_stm32l431xx.s new file mode 100644 index 00000000..6a5c15a5 --- /dev/null +++ b/board/TencentOS_tiny_EVB_MX_Plus/KEIL/kv/startup_stm32l431xx.s @@ -0,0 +1,404 @@ +;********************** COPYRIGHT(c) 2017 STMicroelectronics ****************** +;* File Name : startup_stm32l431xx.s +;* Author : MCD Application Team +;* Description : STM32L431xx Ultra Low Power devices vector table for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the Cortex-M4 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +;* +;* Redistribution and use in source and binary forms, with or without modification, +;* are permitted provided that the following conditions are met: +;* 1. Redistributions of source code must retain the above copyright notice, +;* this list of conditions and the following disclaimer. +;* 2. Redistributions in binary form must reproduce the above copyright notice, +;* this list of conditions and the following disclaimer in the documentation +;* and/or other materials provided with the distribution. +;* 3. Neither the name of STMicroelectronics nor the names of its contributors +;* may be used to endorse or promote products derived from this software +;* without specific prior written permission. +;* +;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;* +;******************************************************************************* +; +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x100 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x100 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window WatchDog + DCD PVD_PVM_IRQHandler ; PVD/PVM1/PVM2/PVM3/PVM4 through EXTI Line detection + DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line + DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line0 + DCD EXTI1_IRQHandler ; EXTI Line1 + DCD EXTI2_IRQHandler ; EXTI Line2 + DCD EXTI3_IRQHandler ; EXTI Line3 + DCD EXTI4_IRQHandler ; EXTI Line4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD CAN1_TX_IRQHandler ; CAN1 TX + DCD CAN1_RX0_IRQHandler ; CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; External Line[9:5]s + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; External Line[15:10] + DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1 + DCD 0 ; Reserved + DCD SPI3_IRQHandler ; SPI3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD COMP_IRQHandler ; COMP Interrupt + DCD LPTIM1_IRQHandler ; LP TIM1 interrupt + DCD LPTIM2_IRQHandler ; LP TIM2 interrupt + DCD 0 ; Reserved + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD LPUART1_IRQHandler ; LP UART1 interrupt + DCD QUADSPI_IRQHandler ; Quad SPI global interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event + DCD I2C3_ER_IRQHandler ; I2C3 error + DCD SAI1_IRQHandler ; Serial Audio Interface 1 global interrupt + DCD 0 ; Reserved + DCD SWPMI1_IRQHandler ; Serial Wire Interface 1 global interrupt + DCD TSC_IRQHandler ; Touch Sense Controller global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD RNG_IRQHandler ; RNG global interrupt + DCD FPU_IRQHandler ; FPU + DCD CRS_IRQHandler ; CRS interrupt + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_PVM_IRQHandler [WEAK] + EXPORT TAMP_STAMP_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT CAN1_TX_IRQHandler [WEAK] + EXPORT CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK] + EXPORT TIM1_UP_TIM16_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT TIM6_DAC_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT LPTIM1_IRQHandler [WEAK] + EXPORT LPTIM2_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT QUADSPI_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT SAI1_IRQHandler [WEAK] + EXPORT SWPMI1_IRQHandler [WEAK] + EXPORT TSC_IRQHandler [WEAK] + EXPORT RNG_IRQHandler [WEAK] + EXPORT FPU_IRQHandler [WEAK] + EXPORT CRS_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_PVM_IRQHandler +TAMP_STAMP_IRQHandler +RTC_WKUP_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +CAN1_TX_IRQHandler +CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_TIM15_IRQHandler +TIM1_UP_TIM16_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTC_Alarm_IRQHandler +SDMMC1_IRQHandler +SPI3_IRQHandler +TIM6_DAC_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +COMP_IRQHandler +LPTIM1_IRQHandler +LPTIM2_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +LPUART1_IRQHandler +QUADSPI_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +SAI1_IRQHandler +SWPMI1_IRQHandler +TSC_IRQHandler +RNG_IRQHandler +FPU_IRQHandler +CRS_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/components/fs/kv/include/tos_kv.h b/components/fs/kv/include/tos_kv.h new file mode 100644 index 00000000..2caf0d47 --- /dev/null +++ b/components/fs/kv/include/tos_kv.h @@ -0,0 +1,333 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _TOS_KV_H_ +#define _TOS_KV_H_ + +#include "tos.h" +#include "tos_kv_err.h" +#include "tos_kv_flash.h" + +/* the max length of write unit, DOUBLEWORD, 64-bit + a better way is to change kv_wunit_t according the the flash program type by precompile, + if to do this, should let user config the flash program type as a macro, and that is not so friendly. + we typedef kv_wunit_t as uint64_t, so the user can focus on the code rather than how to use kv. + (althrough there may cause some waste of flash space, just a little, but much more comfortable for coding) + */ +typedef uint64_t kv_wunit_t; + +typedef uint8_t kv_byte_t; // byte +typedef uint16_t kv_hword_t; // half word +typedef uint32_t kv_word_t; // word +typedef uint64_t kv_dword_t; // double word + +/* + add delete no more space + fresh -----> inuse --------> dirty | inuse ---------------> dirty + + add no more space + fresh -----> inuse ---------------> NONE + + if bad, probably the flash block is broken, no more try to use. + if hanging, maybe another chance to rebuild index. + there is a situation: dirty | hanging +*/ +#define KV_BLK_FLAG_FRESH 0x01 /* a totally virgin block */ +#define KV_BLK_FLAG_INUSE 0x02 /* in-use */ +#define KV_BLK_FLAG_DIRTY 0x04 /* has discarded item inside */ +#define KV_BLK_FLAG_BAD 0x08 /* bad block, maybe device error */ +#define KV_BLK_FLAG_HANGING 0x10 /* index building failed, we mark a hanging flag here, and will give another chance to do a retry */ + +#define KV_FLASH_START (kv_ctl.flash_ctl.flash_start) +#define KV_FLASH_SIZE (kv_ctl.flash_ctl.flash_size) +#define KV_FLASH_END (KV_FLASH_START + KV_FLASH_SIZE) +#define KV_FLASH_SECTOR_SIZE_LOG2 (kv_ctl.flash_ctl.sector_size_log2) +#define KV_FLASH_SECTOR_SIZE (1 << KV_FLASH_SECTOR_SIZE_LOG2) +#define KV_FLASH_WRITE_ALIGN (kv_ctl.flash_ctl.flash_write_align) + +#define KV_FLASH_WRITE ((kv_flash_write_t)(kv_ctl.flash_ctl.flash_drv.write)) +#define KV_FLASH_READ ((kv_flash_read_t)(kv_ctl.flash_ctl.flash_drv.read)) +#define KV_FLASH_ERASE ((kv_flash_erase_t)(kv_ctl.flash_ctl.flash_drv.erase)) + +#define KV_IS_ALINGED(v, align) ((v) % (align) == 0) +#define KV_IS_ALINGED_LOG2(v, align_log2) KV_IS_ALINGED(v, (1 << (align_log2))) +#define KV_ALIGN_UP(v, align) (((v) + ((align) - 1)) & ~((align) - 1)) +#define KV_ALIGN_DOWN(v, align) ((v) - ((v) & ((align) - 1))) +#define KV_ADDR_OF_FIELD(addr, type, field) (addr + TOS_OFFSET_OF_FIELD(type, field)) + +#define KV_ALIGNED_SIZE(len) KV_ALIGN_UP(len, KV_FLASH_WRITE_ALIGN) + +#define KV_MGR_LOCK (&kv_ctl.mgr_ctl.kv_lock) +#define KV_MGR_BLK_NUM_FRESH (kv_ctl.mgr_ctl.blk_info.num_fresh) +#define KV_MGR_BLK_NUM_INUSE (kv_ctl.mgr_ctl.blk_info.num_inuse) +#define KV_MGR_BLK_NUM_HANGING (kv_ctl.mgr_ctl.blk_info.num_hanging) +#define KV_MGR_BLK_NUM_TOTAL (kv_ctl.mgr_ctl.blk_info.num_total) +#define KV_MGR_BLK_DETAIL (kv_ctl.mgr_ctl.blk_info.blk_detail) +#define KV_MGR_WORKSPACE (kv_ctl.mgr_ctl.workspace) + +#define KV_NO_WRITEABLE_BLK() (KV_MGR_BLK_NUM_INUSE == 0 && KV_MGR_BLK_NUM_FRESH == 0) + +#define KV_ITEM_HDR_MAGIC 0xABCD1234DCBA4321 +#define KV_ITEM_DISCARDED 0x0F0F0F0F0F0F0F0F +#define KV_ITEM_IS_DISCARDED(item_hdr) ((item_hdr)->discarded_flag == KV_ITEM_DISCARDED) +#define KV_ITEM_IS_LEGAL(item_hdr) ((item_hdr)->magic == KV_ITEM_HDR_MAGIC) +#define KV_ITEM_IS_FRESH(item_hdr) ((item_hdr)->magic == (kv_wunit_t)-1 && \ + (item_hdr)->discarded_flag == (kv_wunit_t)-1 && \ + (item_hdr)->checksum == (uint8_t)-1 && \ + (item_hdr)->k_len == (uint8_t)-1 && \ + (item_hdr)->v_len == (uint16_t)-1 && \ + (item_hdr)->prev_pos == (uint32_t)-1) + +#define KV_ITEM_ADDR2BLK(item_start) (KV_ALIGN_DOWN((item_start) - KV_FLASH_START, KV_BLK_SIZE) + KV_FLASH_START) +#define KV_ITEM_HDR_SIZE KV_ALIGNED_SIZE(sizeof(kv_item_hdr_t)) +#define KV_ITEM_BODY_SIZE(k_len, v_len) KV_ALIGNED_SIZE(k_len + v_len) +#define KV_ITEM_SIZE(k_len, v_len) (KV_ITEM_HDR_SIZE + KV_ITEM_BODY_SIZE(k_len, v_len)) +#define KV_ITEM_SIZE_OF_ITEM(item) KV_ITEM_SIZE(item->hdr.k_len, item->hdr.v_len) +#define KV_ITEM_SIZE_OF_BODY(item) KV_ITEM_BODY_SIZE(item->hdr.k_len, item->hdr.v_len) +#define KV_ITEM_ADDR_OF_BODY(item) (item->pos + KV_ITEM_HDR_SIZE) + +#define KV_BLK_HDR_MAGIC 0x1234ABCD4321DCBA +#define KV_BLK_IS_LEGAL(blk_hdr) ((blk_hdr)->magic == KV_BLK_HDR_MAGIC) +#define KV_BLK_INVALID ((uint32_t)-1) +#define KV_BLK_HDR_SIZE KV_ALIGNED_SIZE(sizeof(kv_blk_hdr_t)) +#define KV_BLK_SIZE (KV_FLASH_SECTOR_SIZE) +#define KV_BLK_FRESH_SIZE (KV_BLK_SIZE - KV_BLK_HDR_SIZE) +#define KV_BLK_END(blk_start) (blk_start + KV_BLK_SIZE) +#define KV_BLK_USABLE_ADDR(blk_start) (KV_BLK_END(blk_start) - kv_blk_freesz_get(blk_start)) +#define KV_BLK_ADDR2IDX(blk_start) ((blk_start - KV_FLASH_START) / KV_BLK_SIZE) +#define KV_BLK_FIRST_ITEM(blk_start) (blk_start + KV_BLK_HDR_SIZE) +#define KV_BLK_NEXT(blk_start) (blk_start + KV_BLK_SIZE >= KV_FLASH_END ? KV_FLASH_START : blk_start + KV_BLK_SIZE) + +#define KV_BLK_FOREACH_FROM(cur_blk, start_blk) \ + for (cur_blk = KV_BLK_NEXT(start_blk); \ + cur_blk != start_blk; \ + cur_blk = KV_BLK_NEXT(cur_blk)) + +#define KV_BLK_FOREACH(cur_blk) \ + for (cur_blk = KV_FLASH_START; \ + cur_blk < KV_FLASH_END; \ + cur_blk += KV_BLK_SIZE) + +typedef struct kv_flash_control_st { + uint8_t sector_size_log2; + uint8_t flash_write_align; + uint32_t flash_start; + uint32_t flash_size; + + kv_flash_drv_t flash_drv; +} kv_flash_ctl_t; + +typedef struct kv_blk_detail_st { + uint8_t blk_flags; /*< flags indicating the status of the blk, see KV_BLK_FLAG_* */ + uint32_t free_size; /*< how many usable flash left */ +} kv_blk_detail_t; + +typedef struct kv_blk_info_st { + uint16_t num_inuse; + uint16_t num_fresh; + uint16_t num_hanging; + uint16_t num_total; + + kv_blk_detail_t *blk_detail; +} kv_blk_info_t; + +typedef struct kv_manager_control_st { + uint32_t workspace; + kv_blk_info_t blk_info; + + k_mutex_t kv_lock; +} kv_mgr_ctl_t; + +typedef struct kv_control_st { + kv_flash_ctl_t flash_ctl; + kv_mgr_ctl_t mgr_ctl; +} kv_ctl_t; + +typedef struct kv_block_header_st { + kv_wunit_t magic; /*< is this block formatted? */ +} __PACKED__ kv_blk_hdr_t; + +typedef struct kv_item_header_st { + kv_wunit_t discarded_flag; /*< is this item a discarded one, deleted or updated */ + kv_wunit_t magic; /*< for item header integrity verification */ + uint8_t checksum; /*< checksum for key/value buffer */ + uint8_t k_len; /*< key length */ + uint16_t v_len; /*< value length */ + uint32_t prev_pos; /*< previous position of this item + if meet a power down while updating an item, and we have saved the new item, + but do not get a chance to delete the old one(we have two copy of the item with + the same key on flash), we should do the real delete when system is power on next time */ +} __PACKED__ kv_item_hdr_t; + +typedef struct kv_item_st { + kv_item_hdr_t hdr; /*< item header */ + uint32_t pos; /*< where this item is */ + uint8_t *body; /*< item body: key/value buffer */ +} kv_item_t; + +__STATIC__ kv_ctl_t kv_ctl; + +__STATIC_INLINE__ void kv_blk_freesz_set(uint32_t blk_start, uint32_t free_size) +{ + KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].free_size = free_size; +} + +__STATIC_INLINE__ uint32_t kv_blk_freesz_get(uint32_t blk_start) +{ + return KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].free_size; +} + +__STATIC_INLINE__ void kv_blk_freesz_reduce(uint32_t blk_start, uint32_t size_reduced) +{ + kv_blk_freesz_set(blk_start, kv_blk_freesz_get(blk_start) - size_reduced); +} + +__STATIC_INLINE__ int kv_blk_is_full(uint32_t blk_start) +{ + return kv_blk_freesz_get(blk_start) <= KV_ITEM_HDR_SIZE; +} + +__STATIC_INLINE__ void kv_blk_flags_set(uint32_t blk_start, uint8_t blk_flags) +{ + KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags = blk_flags; +} + +__STATIC_INLINE__ uint8_t kv_blk_flags_get(uint32_t blk_start) +{ + return KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags; +} + +__STATIC_INLINE__ void kv_blk_flags_add(uint32_t blk_start, uint8_t blk_flags) +{ + KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags |= blk_flags; +} + +__STATIC_INLINE__ void kv_blk_flags_rmv(uint32_t blk_start, uint8_t blk_flags) +{ + KV_MGR_BLK_DETAIL[KV_BLK_ADDR2IDX(blk_start)].blk_flags &= ~blk_flags; +} + +__STATIC_INLINE__ int kv_blk_is_fresh(uint32_t blk_start) +{ + return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_FRESH; +} + +__STATIC_INLINE__ int kv_blk_is_inuse(uint32_t blk_start) +{ + return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_INUSE; +} + +__STATIC_INLINE__ int kv_blk_is_dirty(uint32_t blk_start) +{ + return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_DIRTY; +} + +__STATIC_INLINE__ int kv_blk_is_bad(uint32_t blk_start) +{ + return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_BAD; +} + +__STATIC_INLINE__ int kv_blk_is_hanging(uint32_t blk_start) +{ + return kv_blk_flags_get(blk_start) & KV_BLK_FLAG_HANGING; +} + +__STATIC_INLINE__ void kv_blk_set_fresh(uint32_t blk_start) +{ + if (!kv_blk_is_fresh(blk_start)) { + ++KV_MGR_BLK_NUM_FRESH; + } + + kv_blk_freesz_set(blk_start, KV_BLK_FRESH_SIZE); + kv_blk_flags_set(blk_start, KV_BLK_FLAG_FRESH); +} + +__STATIC_INLINE__ void kv_blk_set_inuse(uint32_t blk_start) +{ + if (!kv_blk_is_inuse(blk_start)) { + ++KV_MGR_BLK_NUM_INUSE; + } + + kv_blk_flags_add(blk_start, KV_BLK_FLAG_INUSE); +} + +__STATIC_INLINE__ void kv_blk_set_dirty(uint32_t blk_start) +{ + kv_blk_flags_add(blk_start, KV_BLK_FLAG_DIRTY); +} + +__STATIC_INLINE__ void kv_blk_set_bad(uint32_t blk_start) +{ + kv_blk_flags_set(blk_start, KV_BLK_FLAG_BAD); +} + +__STATIC_INLINE__ void kv_blk_set_hanging(uint32_t blk_start) +{ + if (!kv_blk_is_hanging(blk_start)) { + ++KV_MGR_BLK_NUM_HANGING; + } + + kv_blk_flags_add(blk_start, KV_BLK_FLAG_HANGING); +} + +__STATIC_INLINE__ void kv_blk_reset_fresh(uint32_t blk_start) +{ + if (kv_blk_is_fresh(blk_start)) { + --KV_MGR_BLK_NUM_FRESH; + } + + kv_blk_flags_rmv(blk_start, KV_BLK_FLAG_FRESH); +} + +__STATIC_INLINE__ void kv_blk_reset_inuse(uint32_t blk_start) +{ + if (kv_blk_is_inuse(blk_start)) { + --KV_MGR_BLK_NUM_INUSE; + } + + kv_blk_flags_rmv(blk_start, KV_BLK_FLAG_INUSE); +} + +__STATIC_INLINE__ void kv_blk_reset_hanging(uint32_t blk_start) +{ + if (kv_blk_is_hanging(blk_start)) { + --KV_MGR_BLK_NUM_HANGING; + } + + kv_blk_flags_rmv(blk_start, KV_BLK_FLAG_HANGING); +} + +typedef kv_err_t (*kv_item_walker_t)(kv_item_t *item, const void *patten); + +__API__ kv_err_t tos_kv_init(kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop); + +__API__ kv_err_t tos_kv_deinit(void); + +__API__ kv_err_t tos_kv_set(const char *key, const void *value, size_t v_len); + +__API__ kv_err_t tos_kv_get(const char *key, void *value_buf, size_t value_buf_size, size_t *v_len); + +__API__ int tos_kv_has_key(const char *key); + +__API__ kv_err_t tos_kv_del(const char *key); + +__DEBUG__ kv_err_t tos_kv_walkthru(void); + +__STATIC__ kv_err_t kv_gc(void); + +#endif /* _TOS_KV_H_ */ + diff --git a/components/fs/kv/include/tos_kv_err.h b/components/fs/kv/include/tos_kv_err.h new file mode 100644 index 00000000..62b4b4b8 --- /dev/null +++ b/components/fs/kv/include/tos_kv_err.h @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _TOS_KV_ERR_H_ +#define _TOS_KV_ERR_H_ + +typedef enum kv_err_en { + KV_ERR_NONE = 0u, + + KV_ERR_BUF_TOO_SHORT = 10u, + KV_ERR_BLK_STATUS_ERROR, + + KV_ERR_DATA_FETCH_FAILED = 20u, + + KV_ERR_FLASH_ERASE_FAILED = 30u, + KV_ERR_FLASH_READ_FAILED, + KV_ERR_FLASH_WRITE_FAILED, + + KV_ERR_GC_NOTHING = 40u, + + KV_ERR_INTERNAL_ERROR = 50u, + KV_ERR_INSUFFICIENT_SPACE, + KV_ERR_INVALID_PARAM, + KV_ERR_INVALID_ITEM, + + KV_ERR_NEXT_LOOP = 60u, + KV_ERR_NOT_EXIST, + KV_ERR_NO_WRITEABLE_BLK, + + KV_ERR_OUT_OF_MEMORY = 70u, + + KV_ERR_POS_FIX_FAILED =80u, + + KV_ERR_SIZE_EXCEEDED = 90u, +} kv_err_t; + +#endif /* _TOS_KV_ERR_H_ */ + diff --git a/components/fs/kv/include/tos_kv_flash.h b/components/fs/kv/include/tos_kv_flash.h new file mode 100644 index 00000000..1f209a77 --- /dev/null +++ b/components/fs/kv/include/tos_kv_flash.h @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _TOS_KV_FLASH_H_ +#define _TOS_KV_FLASH_H_ + +typedef enum kv_flash_program_type_en { + KV_FLASH_PROGRAM_TYPE_BYTE, /*!< Program byte (8-bit) at a specified address */ + KV_FLASH_PROGRAM_TYPE_HALFWORD, /*!< Program a half-word (16-bit) at a specified address */ + KV_FLASH_PROGRAM_TYPE_WORD, /*!< Program a word (32-bit) at a specified address */ + KV_FLASH_PROGRAM_TYPE_DOUBLEWORD, /*!< Program a double word (64-bit) at a specified address */ +} kv_flash_pgm_type_t; + +typedef int (*kv_flash_write_t)(uint32_t addr, const void *buf, size_t len); +typedef int (*kv_flash_read_t)(uint32_t addr, void *buf, size_t len); +typedef int (*kv_flash_erase_t)(uint32_t addr, size_t len); + +typedef struct kv_flash_drv_st { + kv_flash_write_t write; + kv_flash_read_t read; + kv_flash_erase_t erase; +} kv_flash_drv_t; + +typedef struct kv_flash_property_st { + uint8_t sector_size_log2; + kv_flash_pgm_type_t pgm_type; + uint32_t flash_start; + uint32_t flash_size; +} kv_flash_prop_t; + +#endif /* _TOS_KV_FLASH_H_ */ + diff --git a/components/fs/kv/tos_kv.c b/components/fs/kv/tos_kv.c new file mode 100644 index 00000000..450173d7 --- /dev/null +++ b/components/fs/kv/tos_kv.c @@ -0,0 +1,1348 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#include "tos_kv.h" + +__STATIC__ kv_ctl_t kv_ctl; + +__STATIC__ uint8_t kv_checksum_crc8(uint8_t *buf, int nbyte) +{ + int i; + uint8_t crc = 0; + +#define POLY 0x31 +#define BIT_PER_BYTE 8 +#define TOP_BIT 0x80 + + while (nbyte--) { + crc ^= *buf++; + for (i = 0; i < BIT_PER_BYTE; ++i) { + if (crc & TOP_BIT) { + crc = (crc << 1) ^ POLY; + } else { + crc <<= 1; + } + } + crc &= 0xFF; + } + + return crc; +} + +__STATIC_INLINE__ void kv_lock(void) +{ + if (tos_knl_is_running()) { + tos_mutex_pend(KV_MGR_LOCK); + } +} + +__STATIC_INLINE__ void kv_unlock(void) +{ + if (tos_knl_is_running()) { + tos_mutex_post(KV_MGR_LOCK); + } +} + +__STATIC__ kv_err_t kv_flash_read(uint32_t addr, void *buf, size_t buf_size) +{ + if (KV_FLASH_READ(addr, buf, buf_size) < 0) { + return KV_ERR_FLASH_READ_FAILED; + } + return KV_ERR_NONE; +} + +__STATIC__ kv_err_t kv_flash_write(uint32_t addr, void *buf, size_t buf_size) +{ + if (KV_FLASH_WRITE(addr, buf, buf_size) < 0) { + return KV_ERR_FLASH_WRITE_FAILED; + } + return KV_ERR_NONE; +} + +__STATIC__ kv_err_t kv_flash_erase(uint32_t start, size_t len) +{ + if (KV_FLASH_ERASE(start, len) < 0) { + return KV_ERR_FLASH_ERASE_FAILED; + } + return KV_ERR_NONE; +} + +__STATIC__ kv_err_t kv_flash_wunit_modify(uint32_t addr, kv_wunit_t data) +{ + return kv_flash_write(addr, &data, sizeof(kv_wunit_t)); +} + +__STATIC__ kv_err_t kv_flash_blk_erase(uint32_t blk_start) +{ + return kv_flash_erase(blk_start, KV_BLK_SIZE); +} + +__STATIC__ void kv_flash_ctl_init(kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop) +{ + memcpy(&kv_ctl.flash_ctl.flash_drv, flash_drv, sizeof(kv_flash_drv_t)); + + KV_FLASH_START = flash_prop->flash_start; + KV_FLASH_SIZE = flash_prop->flash_size; + KV_FLASH_SECTOR_SIZE_LOG2 = flash_prop->sector_size_log2; + + if (flash_prop->pgm_type == KV_FLASH_PROGRAM_TYPE_BYTE) { + KV_FLASH_WRITE_ALIGN = sizeof(kv_byte_t); + } else if (flash_prop->pgm_type == KV_FLASH_PROGRAM_TYPE_HALFWORD) { + KV_FLASH_WRITE_ALIGN = sizeof(kv_hword_t); + } else if (flash_prop->pgm_type == KV_FLASH_PROGRAM_TYPE_WORD) { + KV_FLASH_WRITE_ALIGN = sizeof(kv_word_t); + } else if (flash_prop->pgm_type == KV_FLASH_PROGRAM_TYPE_DOUBLEWORD) { + KV_FLASH_WRITE_ALIGN = sizeof(kv_dword_t); + } +} + +__STATIC__ kv_err_t kv_blk_hdr_read(uint32_t blk_start, kv_blk_hdr_t *blk_hdr) +{ + return kv_flash_read(blk_start, blk_hdr, sizeof(kv_blk_hdr_t)); +} + +__STATIC__ kv_err_t kv_blk_format(uint32_t blk_start) +{ + if (kv_flash_blk_erase(blk_start) != KV_ERR_NONE) { + return KV_ERR_FLASH_ERASE_FAILED; + } + + if (kv_flash_wunit_modify(KV_ADDR_OF_FIELD(blk_start, kv_blk_hdr_t, magic), + KV_BLK_HDR_MAGIC) != KV_ERR_NONE) { + return KV_ERR_FLASH_WRITE_FAILED; + } + + kv_blk_set_fresh(blk_start); + + return KV_ERR_NONE; +} + +__STATIC__ uint32_t kv_blk_next_fresh(void) +{ + uint32_t cur_blk; + + // we try to find a fresh block behind current block(take all the blocks as a ring) + KV_BLK_FOREACH_FROM(cur_blk, KV_MGR_WORKSPACE) { + if (kv_blk_is_fresh(cur_blk)) { + return cur_blk; + } + } + + return KV_BLK_INVALID; +} + +__STATIC__ uint32_t kv_blk_search_inuse(uint32_t item_size) +{ + uint32_t cur_blk; + + KV_BLK_FOREACH_FROM(cur_blk, KV_MGR_WORKSPACE) { + if (kv_blk_is_inuse(cur_blk) && + kv_blk_freesz_get(cur_blk) >= item_size) { + return cur_blk; + } + } + + return KV_BLK_INVALID; +} + +__STATIC__ uint32_t kv_blk_search_suitable(uint32_t item_size) +{ + uint32_t the_blk; + + // no more writeable block, no need to do the next logic + if (KV_NO_WRITEABLE_BLK()) { + return KV_BLK_INVALID; + } + + // no more blocks with sufficient space, searched before + if (KV_MGR_WORKSPACE == KV_BLK_INVALID) { + return KV_BLK_INVALID; + } + + do { + // current workspace is just ok(workspace is kinda cache) + if (kv_blk_freesz_get(KV_MGR_WORKSPACE) >= item_size) { + return KV_MGR_WORKSPACE; + } + + // first we should search in inuse blocks + the_blk = kv_blk_search_inuse(item_size); + if (the_blk != KV_BLK_INVALID) { + KV_MGR_WORKSPACE = the_blk; + return KV_MGR_WORKSPACE; + } + + // no more fresh block, cannot allocate new block and cannot do gc neither. + if (KV_MGR_BLK_NUM_FRESH < 1) { + KV_MGR_WORKSPACE = KV_BLK_INVALID; + return KV_MGR_WORKSPACE; + } + + // if we have more than one fresh block, just give it out + if (KV_MGR_BLK_NUM_FRESH > 1) { + KV_MGR_WORKSPACE = kv_blk_next_fresh(); + return KV_MGR_WORKSPACE; + } + + // no more block inuse has sufficient space, and only one fresh block left, we should try gc + if (KV_MGR_BLK_NUM_FRESH == 1) { + if (kv_gc() != KV_ERR_NONE) { + // no more dirty block to gc, we give out the last precious fresh block(no more gc any more) + KV_MGR_WORKSPACE = kv_blk_next_fresh(); + return KV_MGR_WORKSPACE; + } + + /* if reach here, means we free some discarded space by gc, + we should try to search in inuse block again(the only fresh block left is so precious that we should + give it out as a last resort). + */ + } + } while (K_TRUE); +} + +__STATIC__ kv_err_t kv_item_hdr_write(uint32_t item_start, kv_item_hdr_t *item_hdr) +{ + if (kv_flash_write(KV_ADDR_OF_FIELD(item_start, kv_item_hdr_t, checksum), + &item_hdr->checksum, + KV_ITEM_HDR_SIZE - sizeof(kv_wunit_t) * 2) != KV_ERR_NONE) { + return KV_ERR_FLASH_WRITE_FAILED; + } + + return kv_flash_wunit_modify(KV_ADDR_OF_FIELD(item_start, kv_item_hdr_t, magic), + item_hdr->magic); +} + +__STATIC__ kv_err_t kv_item_write(uint32_t item_start, kv_item_hdr_t *item_hdr, const uint8_t *item_body, uint32_t item_body_len) +{ + /* + write item header first, then the kv buffer(item body). + if meat a power down while item writing, we wanna the consequence is predictable. + + *** for some norflash on-chip, no support for multi-times-write on the same write unit, + that means the 0xFF -> 0xEE -> 0xCC -> 0x44 trick actually does not work. + only write once on one single write unit. + so we do the header write except the kv_wunit_t domain(donnot waste the chance to modify + essential member, like discarded_flag, otherwise we have to "erase" before "write" again). + */ + + // write header, if a power down happen here, we can know it by header magic verify. + if (kv_item_hdr_write(item_start, item_hdr) != KV_ERR_NONE) { + return KV_ERR_FLASH_WRITE_FAILED; + } + + // if a power down happen here, we can know it by checksum verify. + + // write body(key & value) + return kv_flash_write(item_start + KV_ITEM_HDR_SIZE, (void *)item_body, item_body_len); +} + +__STATIC__ kv_err_t kv_item_hdr_read(uint32_t item_start, kv_item_hdr_t *item_hdr) +{ + return kv_flash_read(item_start, item_hdr, sizeof(kv_item_hdr_t)); +} + +__STATIC__ kv_err_t kv_item_body_read(kv_item_t *item) +{ + uint8_t *kv_buf = K_NULL; + + kv_buf = (uint8_t *)tos_mmheap_alloc(KV_ITEM_SIZE_OF_BODY(item)); + if (!kv_buf) { + return KV_ERR_OUT_OF_MEMORY; + } + + if (kv_flash_read(KV_ITEM_ADDR_OF_BODY(item), kv_buf, + KV_ITEM_SIZE_OF_BODY(item)) != KV_ERR_NONE) { + tos_mmheap_free(kv_buf); + return KV_ERR_FLASH_READ_FAILED; + } + + item->body = kv_buf; + + return KV_ERR_NONE; +} + +__STATIC__ kv_err_t kv_item_do_delete(uint32_t item_start) +{ + // set the discarded_flag on the flash + return kv_flash_wunit_modify(KV_ADDR_OF_FIELD(item_start, kv_item_hdr_t, discarded_flag), KV_ITEM_DISCARDED); +} + +__STATIC__ kv_err_t kv_item_delete_aux(uint32_t item_start) +{ + if (kv_item_do_delete(item_start) != KV_ERR_NONE) { + return KV_ERR_FLASH_WRITE_FAILED; + } + + kv_blk_set_dirty(KV_ITEM_ADDR2BLK(item_start)); + + return KV_ERR_NONE; +} + +__STATIC__ kv_err_t kv_item_delete(kv_item_t *item) +{ + return kv_item_delete_aux(item->pos); +} + +__STATIC__ kv_err_t kv_item_try_delete(kv_item_t *item) +{ + uint8_t *prev_key; + uint32_t prev_pos; + uint8_t prev_k_len, k_len; + kv_item_hdr_t prev_item_hdr; + + prev_pos = item->hdr.prev_pos; + + if (kv_item_hdr_read(prev_pos, &prev_item_hdr) != KV_ERR_NONE) { + return KV_ERR_FLASH_READ_FAILED; + } + + if (!KV_ITEM_IS_LEGAL(&prev_item_hdr) || + KV_ITEM_IS_DISCARDED(&prev_item_hdr)) { + /* situation 1 in kv_item_update, the prev_pos is in a fresh block now(for gc sake), + no need to delete the previous one. + */ + return KV_ERR_NONE; + } + + // test if situation 2 in kv_item_update happened + + k_len = item->hdr.k_len; + prev_k_len = prev_item_hdr.k_len; + + if (k_len != prev_k_len) { + return KV_ERR_NONE; + } + + prev_key = (uint8_t *)tos_mmheap_alloc(k_len); + if (!prev_key) { + return KV_ERR_OUT_OF_MEMORY; + } + + if (kv_flash_read(prev_pos + KV_ITEM_HDR_SIZE, prev_key, k_len) != KV_ERR_NONE) { + tos_mmheap_free(prev_key); + return KV_ERR_FLASH_READ_FAILED; + } + + // key changes, means another turn of gc happened, the previous block is filled with new item. + if (memcmp(prev_key, (void *)KV_ITEM_ADDR_OF_BODY(item), k_len) != 0) { + tos_mmheap_free(prev_key); + return KV_ERR_NONE; + } + + // the previous item is still there, delete it. + return kv_item_delete_aux(prev_pos); +} + +__STATIC_INLINE__ void kv_item_free(kv_item_t *item) +{ + if (item->body) { + tos_mmheap_free(item->body); + } + tos_mmheap_free(item); +} + +__STATIC__ int kv_item_hdr_verify(kv_item_hdr_t *item_hdr, uint32_t item_start, uint32_t blk_start) +{ + uint8_t k_len; + uint16_t v_len; + + k_len = item_hdr->k_len; + v_len = item_hdr->v_len; + + // 1. test key/value size + if (k_len == 0 || + v_len == 0 || + k_len == (uint8_t)-1 || + v_len == (uint16_t)-1) { + return K_FALSE; + } + + // 2. test the flash address range + if (item_start + KV_ITEM_SIZE(k_len, v_len) > KV_BLK_END(blk_start)) { + return K_FALSE; + } + + if (item_start + KV_ITEM_SIZE(k_len, v_len) > KV_FLASH_END) { + return K_FALSE; + } + + return K_TRUE; +} + +__STATIC_INLINE__ int kv_item_body_verify(kv_item_t *item) +{ + return item->hdr.checksum == kv_checksum_crc8(item->body, item->hdr.k_len + item->hdr.v_len); +} + +__STATIC_INLINE__ int kv_item_is_updated_one(kv_item_t *item) +{ + /* attention: + there's a possibility that item->pos equals to item->hdr.prev_pos, + if this happen, means the previous one is gc-ed, and the "item" is just + moved to the prev_pos by coincidence. + that means the previous one is not in prev_pos any more. no need to delete. + */ + return item->hdr.prev_pos != 0 && item->pos != item->hdr.prev_pos; +} + +__STATIC__ int kv_item_is_moved(kv_item_t *item) +{ + kv_err_t err; + int is_moved = K_FALSE; + kv_item_hdr_t item_hdr; + uint8_t *body_backup = K_NULL; + + // drag the header out of the flash + err = kv_item_hdr_read(item->pos, &item_hdr); + if (err != KV_ERR_NONE) { + return K_FALSE; + } + + // compare the header + if (memcmp(&item_hdr, &item->hdr, sizeof(kv_item_hdr_t)) != 0) { + return K_TRUE; + } + + // backup the body + body_backup = item->body; + + // drag the body out of the flash + err = kv_item_body_read(item); + if (err != KV_ERR_NONE) { + return K_FALSE; + } + + // compare the body + if (memcmp(body_backup, item->body, item->hdr.k_len + item->hdr.v_len) != 0) { + is_moved = K_TRUE; + } + + tos_mmheap_free(item->body); + item->body = body_backup; + + return is_moved; +} + +__STATIC__ kv_err_t kv_item_do_gc(kv_item_t *item, const void *dummy) +{ + kv_err_t err; + + err = kv_item_body_read(item); + if (err != KV_ERR_NONE) { + return err; + } + + if (kv_item_write(KV_BLK_USABLE_ADDR(KV_MGR_WORKSPACE), + &item->hdr, item->body, + KV_ITEM_SIZE_OF_BODY(item)) != KV_ERR_NONE) { + return KV_ERR_FLASH_WRITE_FAILED; + } + + // reduce the free_size + kv_blk_freesz_reduce(KV_MGR_WORKSPACE, KV_ITEM_SIZE_OF_ITEM(item)); + + return KV_ERR_NEXT_LOOP; +} + +__STATIC__ kv_err_t kv_item_do_fetch_new_copy(kv_item_t *item, const void *the_item) +{ + kv_err_t err; + kv_item_t *dst_item; + uint8_t k_len, dst_k_len; + uint16_t v_len, dst_v_len; + + dst_item = (kv_item_t *)the_item; + dst_k_len = dst_item->hdr.k_len; + dst_v_len = dst_item->hdr.v_len; + + k_len = item->hdr.k_len; + v_len = item->hdr.v_len; + + if (k_len != dst_k_len || + v_len != dst_v_len) { + return KV_ERR_NEXT_LOOP; + } + + err = kv_item_body_read(item); + if (err != KV_ERR_NONE) { + return err; + } + + if (memcmp(item->body, dst_item->body, k_len + v_len) == 0) { + return KV_ERR_NONE; + } + + return KV_ERR_NEXT_LOOP; +} + +__STATIC__ kv_err_t kv_item_do_fetch(kv_item_t *item, const void *key) +{ + kv_err_t err; + uint8_t k_len; + + k_len = item->hdr.k_len; + + if (strlen((const char *)key) != k_len) { + return KV_ERR_NEXT_LOOP; + } + + err = kv_item_body_read(item); + if (err != KV_ERR_NONE) { + return err; + } + + if (memcmp(item->body, key, k_len) == 0) { + return KV_ERR_NONE; + } + + return KV_ERR_NEXT_LOOP; +} + +__STATIC__ kv_err_t kv_item_do_recovery(kv_item_t *item, const void *dummy) +{ + kv_err_t err; + + err = kv_item_body_read(item); + if (err != KV_ERR_NONE) { + return err; + } + + if (!kv_item_body_verify(item)) { + err = kv_item_delete(item); + } else if (kv_item_is_updated_one(item)) { + /* we need to take a look inside into the previous item, + to check whether the previous one is correctly deleted. + maybe a power down happened during the update + */ + + /* + if current item's pos is not as same as its prev_pos, two situation: + 1. the item is be gc-ed to another block(just the same). + 2. the item is updated, the new data is saved but the old one may be not deleted. + */ + err = kv_item_try_delete(item); + } + + if (err != KV_ERR_NONE) { + return err; + } + + return KV_ERR_NEXT_LOOP; +} + +/* + aos's logic framework is nice here, so I learn from it. + although I have my own idea to write this logic, but the more other kv logic I process, + the more reasonable of this framework I find. thanks. +*/ +__STATIC__ kv_err_t kv_item_walkthru(uint32_t blk_start, + kv_item_walker_t walker, + const void *patten, + kv_item_t **item_out) +{ + kv_err_t err; + uint32_t cur_item; + kv_item_t *item; + kv_item_hdr_t *item_hdr; + int is_item_integral = K_TRUE; + + if (item_out) { + *item_out = K_NULL; + } + + cur_item = KV_BLK_FIRST_ITEM(blk_start); + + do { + is_item_integral = K_TRUE; + + item = (kv_item_t *)tos_mmheap_alloc(sizeof(kv_item_t)); + if (!item) { + return KV_ERR_OUT_OF_MEMORY; + } + + item->body = K_NULL; + item_hdr = &item->hdr; + + // drag the item header out of the flash to see whether is a legal item + err = kv_item_hdr_read(cur_item, item_hdr); + if (err != KV_ERR_NONE) { + kv_item_free(item); + return err; + } + + /* meet a magic none-set item + if magic is not set: + 1. it's a fresh item slot(not used) + 2. meet a power down before item magic write done + */ + if (!KV_ITEM_IS_LEGAL(item_hdr)) { + if (KV_ITEM_IS_FRESH(item_hdr)) { + // situation 1, it's a fresh item slot, meet the ending + kv_item_free(item); + break; + } + + // situation 2, meet power down, probably broken, just mark the item as discarded + is_item_integral = K_FALSE; + } + + if (!is_item_integral || + !kv_item_hdr_verify(item_hdr, cur_item, blk_start)) { + // it's no integral item, or header verify illegal + if (kv_item_do_delete(cur_item) == KV_ERR_NONE) { + kv_blk_set_dirty(blk_start); + } + + cur_item += KV_ITEM_HDR_SIZE; + kv_item_free(item); + + continue; + } + + if (!KV_ITEM_IS_DISCARDED(item_hdr)) { + // tell the item where he is, he does not know yet. + item->pos = cur_item; + + err = walker(item, patten); + if (err == KV_ERR_NONE) { + if (item_out) { + *item_out = item; + } + return KV_ERR_NONE; + } else if (err != KV_ERR_NEXT_LOOP) { + kv_item_free(item); + return err; + } + } else { + // it's a discarded item, deleted before + kv_blk_set_dirty(blk_start); + } + + cur_item += KV_ITEM_SIZE(item_hdr->k_len, item_hdr->v_len); + kv_item_free(item); + } while (cur_item + KV_ITEM_HDR_SIZE < KV_BLK_END(blk_start)); + + // have walked through all the items, get enough information to refresh the index(blk_info). + if (cur_item == KV_BLK_FIRST_ITEM(blk_start)) { + // come from fresh block break + kv_blk_set_fresh(blk_start); + } else if (cur_item + KV_ITEM_HDR_SIZE < KV_BLK_END(blk_start)) { + // come from while ending + kv_blk_freesz_set(blk_start, KV_BLK_END(blk_start) - cur_item); + kv_blk_set_inuse(blk_start); + } else { + // go across the boarder, means the space left is insufficient + kv_blk_freesz_set(blk_start, 0); + kv_blk_reset_inuse(blk_start); + } + + return KV_ERR_NONE; +} + +__STATIC__ kv_item_t *kv_item_do_find(uint32_t blk_start, const char *key) +{ + kv_item_t *the_item; + + if (kv_item_walkthru(blk_start, kv_item_do_fetch, key, &the_item) == KV_ERR_NONE) { + return the_item; + } + + return K_NULL; +} + +__STATIC__ kv_item_t *kv_item_find(const char *key) +{ + uint32_t cur_blk; + kv_item_t *item; + + KV_BLK_FOREACH(cur_blk) { + if (kv_blk_is_bad(cur_blk) || + kv_blk_is_fresh(cur_blk)) { + continue; + } + + item = kv_item_do_find(cur_blk, key); + if (item) { + return item; + } + } + return K_NULL; +} + +__STATIC__ kv_item_t *kv_item_do_find_new_copy(uint32_t blk_start, kv_item_t *item) +{ + kv_item_t *the_item; + + if (kv_item_walkthru(blk_start, kv_item_do_fetch_new_copy, + item, &the_item) == KV_ERR_NONE) { + return the_item; + } + + return K_NULL; +} + +__STATIC__ kv_item_t *kv_item_find_new_copy(kv_item_t *the_item) +{ + uint32_t cur_blk; + kv_item_t *item; + + KV_BLK_FOREACH(cur_blk) { + if (kv_blk_is_bad(cur_blk) || + kv_blk_is_fresh(cur_blk)) { + continue; + } + + item = kv_item_do_find_new_copy(cur_blk, the_item); + if (item) { + return item; + } + } + return K_NULL; +} + +__STATIC__ kv_err_t kv_item_do_save(uint32_t item_start, const char *k, const void *v, size_t v_len, uint32_t prev_pos) +{ + kv_err_t err; + uint8_t k_len; + uint32_t kv_len; + kv_item_hdr_t item_hdr; + uint8_t *kv_buf = K_NULL; + + k_len = strlen(k); + kv_len = KV_ITEM_BODY_SIZE(k_len, v_len); + + kv_buf = (uint8_t *)tos_mmheap_alloc(kv_len); + if (!kv_buf) { + return KV_ERR_OUT_OF_MEMORY; + } + + memset(kv_buf, 0, kv_len); + memcpy(kv_buf, k, k_len); + memcpy(kv_buf + k_len, v, v_len); + + item_hdr.magic = KV_ITEM_HDR_MAGIC; + item_hdr.checksum = kv_checksum_crc8(kv_buf, k_len + v_len); + + item_hdr.k_len = k_len; + item_hdr.v_len = v_len; + item_hdr.prev_pos = prev_pos; + + // we donnot deal with the discarded_flag here + err = kv_item_write(item_start, &item_hdr, kv_buf, kv_len); + + tos_mmheap_free(kv_buf); + + return err; +} + +__STATIC__ int kv_item_value_is_match(kv_item_t *item, const void *value, size_t value_len) +{ + uint8_t k_len; + uint16_t v_len; + + k_len = item->hdr.k_len; + v_len = item->hdr.v_len; + + if (value_len != v_len) { + return K_FALSE; + } + + if (memcmp(item->body + k_len, value, v_len) != 0) { + return K_FALSE; + } + + return K_TRUE; +} + +__STATIC__ kv_err_t kv_item_fix(kv_item_t *item) +{ + kv_item_t *moved_item; + + moved_item = kv_item_find_new_copy(item); + if (!moved_item) { + return KV_ERR_POS_FIX_FAILED; + } + + item->pos = moved_item->pos; + + kv_item_free(moved_item); + + return KV_ERR_NONE; +} + +__STATIC__ kv_err_t kv_item_save(const char *k, const void *v, size_t v_len, kv_item_t *prev_item) +{ + kv_err_t err; + uint32_t blk_start, k_len, item_size; + + k_len = strlen(k); + item_size = KV_ITEM_SIZE(k_len, v_len); + + blk_start = kv_blk_search_suitable(item_size); + if (blk_start == KV_BLK_INVALID) { + return KV_ERR_INSUFFICIENT_SPACE; + } + + /* gc may have been triggered in kv_blk_search_suitable, the "item" has been gc-ed from its original block to another, + so there is a possibility that neither the item->pos nor item->hdr.prev_pos is valid any more(actually the + prev_pos(is the "item->pos") of the new item is not valid either). + and there is no way to know where the new position of the "item" is (except to search again). + this may cause seriously bug. + */ + + /* gc maybe has been triggered in kv_blk_search_suitable, and the prev_item maybe moved from its + original block to another, we should identify this situation, and do kv_item_fix + */ + if (prev_item && kv_item_is_moved(prev_item)) { + /* we quite sure that the item is moved to another block because of gc. + find the new position of the item + */ + err = kv_item_fix(prev_item); + if (err != KV_ERR_NONE) { + return err; + } + } + + err = kv_item_do_save(KV_BLK_USABLE_ADDR(blk_start), k, v, v_len, prev_item ? prev_item->pos : 0); + if (err != KV_ERR_NONE) { + return err; + } + + // reduce the free_size + kv_blk_freesz_reduce(blk_start, item_size); + + if (kv_blk_is_fresh(blk_start)) { + kv_blk_reset_fresh(blk_start); + + if (!kv_blk_is_full(blk_start)) { + kv_blk_set_inuse(blk_start); + } + } else if (kv_blk_is_full(blk_start)) { + kv_blk_reset_inuse(blk_start); + } + + return KV_ERR_NONE; +} + +__STATIC__ kv_err_t kv_item_update(kv_item_t *item, const char *key, const void *value, size_t value_len) +{ + kv_err_t err; + + if (kv_item_value_is_match(item, value, value_len)) { + return KV_ERR_NONE; + } + + /* save first, then delete, is trying best to keep data integrality. */ + + err = kv_item_save(key, value, value_len, item); + if (err != KV_ERR_NONE) { + return err; + } + + /* + if gc triggered int kv_item_save, and the "item" has been gc-ed from its original block to another, + AND worse than that, a power down just happen here. + 1. the previous block is fresh(after gc) + 2. the previous block is filled with other items(another round of gc happen) + no matter 1 or 2 happen, when recovery, should test whether the item in prev_pos is legal(if not, means + block of prev_pos is fresh now), or with the same key as the "item"(the item in prev_pos may be one with + new key for gc's sake). + a lot of things should be done in kv_item_try_delete. + */ + + return kv_item_delete(item); +} + +__STATIC__ kv_err_t kv_param_verify(kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop) +{ + if (!flash_drv || !flash_prop) { + return KV_ERR_INVALID_PARAM; + } + + if (!KV_IS_ALINGED_LOG2(flash_prop->flash_start, flash_prop->sector_size_log2)) { + return KV_ERR_INVALID_PARAM; + } + + if (!KV_IS_ALINGED_LOG2(flash_prop->flash_size, flash_prop->sector_size_log2)) { + return KV_ERR_INVALID_PARAM; + } + + return KV_ERR_NONE; +} + +__STATIC_INLINE__ kv_err_t kv_mgr_index_build(uint32_t blk_start) +{ + return kv_item_walkthru(blk_start, kv_item_do_recovery, K_NULL, K_NULL); +} + +__STATIC__ int kv_mgr_blk_index_rebuild(void) +{ + uint32_t cur_blk; + int is_rebuild_done = K_FALSE; + + KV_BLK_FOREACH(cur_blk) { + if (kv_blk_is_hanging(cur_blk)) { + if (kv_mgr_index_build(cur_blk) == KV_ERR_NONE) { + kv_blk_reset_hanging(cur_blk); + is_rebuild_done = K_TRUE; + } + } + } + + return is_rebuild_done; +} + +__STATIC__ kv_err_t kv_mgr_workspace_locate(void) +{ + uint32_t cur_blk; + + /* we give blocks with KV_BLK_FLAG_HANGING a chance to rebuild index */ + if (KV_MGR_BLK_NUM_HANGING > 0) { + kv_mgr_blk_index_rebuild(); + } + + if (KV_NO_WRITEABLE_BLK()) { + return KV_ERR_NO_WRITEABLE_BLK; + } + + /* if no block inuse, we locate workspace in first fresh block + else locate in first block inuse + */ + KV_BLK_FOREACH(cur_blk) { + if (KV_MGR_BLK_NUM_INUSE == 0) { + if (kv_blk_is_fresh(cur_blk)) { + KV_MGR_WORKSPACE = cur_blk; + return KV_ERR_NONE; + } + } else if (kv_blk_is_inuse(cur_blk)) { + KV_MGR_WORKSPACE = cur_blk; + return KV_ERR_NONE; + } + } + + // actually unreachable here, but have to make compiler happy + return KV_ERR_NONE; +} + +__STATIC__ void kv_mgr_ctl_build(void) +{ + uint32_t cur_blk; + kv_blk_hdr_t blk_hdr; + + KV_BLK_FOREACH(cur_blk) { + if (kv_blk_hdr_read(cur_blk, &blk_hdr) != KV_ERR_NONE) { + // sth must be wrong seriously with this block + kv_blk_set_bad(cur_blk); + continue; + } + + if (!KV_BLK_IS_LEGAL(&blk_hdr)) { + if (kv_blk_format(cur_blk) != KV_ERR_NONE) { + // sth must be wrong seriously with this block + kv_blk_set_bad(cur_blk); + } + // we get a fresh block + continue; + } + + // do index building + if (kv_mgr_index_build(cur_blk) != KV_ERR_NONE) { + // sth goes wrong while index building, we give it a mark + kv_blk_set_hanging(cur_blk); + continue; + } + } +} + +__STATIC__ kv_err_t kv_mgr_ctl_init(void) +{ + kv_blk_detail_t *blk_detail; + + KV_MGR_BLK_NUM_TOTAL = KV_FLASH_SIZE / KV_FLASH_SECTOR_SIZE; + + blk_detail = (kv_blk_detail_t *)tos_mmheap_alloc(sizeof(kv_blk_detail_t) * KV_MGR_BLK_NUM_TOTAL); + if (!blk_detail) { + return KV_ERR_OUT_OF_MEMORY; + } + + memset(blk_detail, 0, sizeof(kv_blk_detail_t) * KV_MGR_BLK_NUM_TOTAL); + KV_MGR_BLK_DETAIL = blk_detail; + + if (tos_mutex_create(KV_MGR_LOCK) != K_ERR_NONE) { + return KV_ERR_INTERNAL_ERROR; + } + + return KV_ERR_NONE; +} + +__STATIC__ void kv_mgr_ctl_deinit(void) +{ + tos_mutex_destroy(KV_MGR_LOCK); + tos_mmheap_free(KV_MGR_BLK_DETAIL); + KV_MGR_BLK_DETAIL = K_NULL; + + memset(&kv_ctl, 0, sizeof(kv_ctl)); +} + +__STATIC__ kv_err_t kv_do_gc(uint32_t dirty_blk) +{ + return kv_item_walkthru(dirty_blk, kv_item_do_gc, K_NULL, K_NULL); +} + +/* on each turn of gc, we free some discarded items in the dirty block. + so we get more space to save the new item. + gc should be done only when necessary, if there is no sitiation of an item too big to save, + should not do gc(gc cause erase/write of the flash). + */ +__STATIC__ kv_err_t kv_gc(void) +{ + uint32_t cur_blk, workspace_backup; + int is_gc_done = K_FALSE, is_rebuild_done = K_FALSE; + + /* we give blocks with KV_BLK_FLAG_HANGING a chance to rebuild index */ + if (KV_MGR_BLK_NUM_HANGING > 0) { + is_rebuild_done = kv_mgr_blk_index_rebuild(); + } + + workspace_backup = KV_MGR_WORKSPACE; + + // there must be at least one fresh block left, make workspace pointer to the fresh one + KV_MGR_WORKSPACE = kv_blk_next_fresh(); + + KV_BLK_FOREACH(cur_blk) { + if (kv_blk_is_dirty(cur_blk)) { + if (kv_do_gc(cur_blk) != KV_ERR_NONE) { + // cannot do gc for this block, give others a try + continue; + } + + kv_blk_reset_inuse(cur_blk); + + if (kv_blk_format(cur_blk) != KV_ERR_NONE) { + kv_blk_set_bad(cur_blk); + } + + kv_blk_reset_fresh(KV_MGR_WORKSPACE); + + if (!kv_blk_is_full(KV_MGR_WORKSPACE)) { + kv_blk_set_inuse(KV_MGR_WORKSPACE); + } + + is_gc_done = K_TRUE; + + break; + } + } + + if (!is_gc_done) { + // if do nothing, should restore the workspace; + KV_MGR_WORKSPACE = workspace_backup; + } + + return (is_gc_done || is_rebuild_done) ? KV_ERR_NONE : KV_ERR_GC_NOTHING; +} + +__DEBUG__ __STATIC__ void kv_u8_disp(uint8_t *buf, size_t buf_len) +{ + int i = 0; + + printf("\""); + for (i = 0; i < buf_len; ++i) { + printf("%c", buf[i]); + } + printf("\"\n"); +} + +__DEBUG__ __STATIC__ kv_err_t kv_block_walkthru(uint32_t blk_start) +{ + int i = 0; + kv_err_t err; + uint32_t cur_item; + kv_item_t *item; + kv_item_hdr_t *item_hdr; + int is_item_integral = K_TRUE; + + cur_item = KV_BLK_FIRST_ITEM(blk_start); + + do { + printf("\n - [%d] item\n", i++); + printf(" - addr: 0x%x\n", cur_item); + + is_item_integral = K_TRUE; + + item = (kv_item_t *)tos_mmheap_alloc(sizeof(kv_item_t)); + if (!item) { + printf("OUT OF MEMORY\n"); + return KV_ERR_OUT_OF_MEMORY; + } + + item->body = K_NULL; + item_hdr = &item->hdr; + + err = kv_item_hdr_read(cur_item, item_hdr); + if (err != KV_ERR_NONE) { + printf(" - header read failed\n"); + kv_item_free(item); + return err; + } + + if (!KV_ITEM_IS_LEGAL(item_hdr)) { + if (KV_ITEM_IS_FRESH(item_hdr)) { + kv_item_free(item); + break; + } + + is_item_integral = K_FALSE; + } + + if (!is_item_integral) { + printf(" - not integral\n"); + } + + if (!kv_item_hdr_verify(item_hdr, cur_item, blk_start)) { + printf(" - header verify failed\n"); + } + + if (KV_ITEM_IS_DISCARDED(item_hdr)) { + printf(" - discarded\n"); + } + + if (!is_item_integral || + !kv_item_hdr_verify(item_hdr, cur_item, blk_start)) { + + cur_item += KV_ITEM_HDR_SIZE; + kv_item_free(item); + + continue; + } + + item->pos = cur_item; + + err = kv_item_body_read(item); + if (err == KV_ERR_NONE) { + if (!kv_item_body_verify(item)) { + printf(" - body verify failed\n"); + } else { + printf(" - prev_pos: 0x%x [%d block]\n", item->hdr.prev_pos, KV_BLK_ADDR2IDX(KV_ITEM_ADDR2BLK(item->hdr.prev_pos))); + printf(" - curr_pos: 0x%x [%d block]\n", item->pos, KV_BLK_ADDR2IDX(KV_ITEM_ADDR2BLK(item->pos))); + printf(" - k_len: %d\n", item->hdr.k_len); + printf(" - v_len: %d\n", item->hdr.v_len); + printf(" - k: "); + kv_u8_disp(item->body, item->hdr.k_len); + printf(" - v: "); + kv_u8_disp(item->body + item->hdr.k_len, item->hdr.v_len); + } + } + + cur_item += KV_ITEM_SIZE(item_hdr->k_len, item_hdr->v_len); + kv_item_free(item); + } while (cur_item + KV_ITEM_HDR_SIZE < KV_BLK_END(blk_start)); + + // have walked through all the items, get enough information to refresh the index(blk_info). + if (cur_item == KV_BLK_FIRST_ITEM(blk_start)) { + printf("block fresh\n"); + } else if (cur_item + KV_ITEM_HDR_SIZE < KV_BLK_END(blk_start)) { + printf("block inuse, freesize: 0x%x\n", KV_BLK_END(blk_start) - cur_item); + } else { + printf("block full\n"); + } + + return KV_ERR_NONE; +} + +__DEBUG__ kv_err_t tos_kv_walkthru(void) +{ + int i = 0; + uint32_t cur_blk; + kv_blk_hdr_t blk_hdr; + + printf("workspace: 0x%x [%d block]\n", KV_MGR_WORKSPACE, KV_BLK_ADDR2IDX(KV_MGR_WORKSPACE)); + + KV_BLK_FOREACH(cur_blk) { + printf("[%d] block\n", i++); + printf("addr: 0x%x\n", cur_blk); + + if (kv_blk_hdr_read(cur_blk, &blk_hdr) != KV_ERR_NONE) { + printf("block header read failed\n"); + continue; + } + + if (!KV_BLK_IS_LEGAL(&blk_hdr)) { + printf("block not formatted\n"); + continue; + } + + if (kv_block_walkthru(cur_blk) != KV_ERR_NONE) { + printf("block diagnosis failed\n"); + continue; + } + + printf("\n\n"); + } + + return KV_ERR_NONE; +} + +__API__ kv_err_t tos_kv_init(kv_flash_drv_t *flash_drv, kv_flash_prop_t *flash_prop) +{ + kv_err_t err; + + if (kv_param_verify(flash_drv, flash_prop) != KV_ERR_NONE) { + return KV_ERR_INVALID_PARAM; + } + + memset(&kv_ctl, 0, sizeof(kv_ctl)); + + kv_flash_ctl_init(flash_drv, flash_prop); + + err = kv_mgr_ctl_init(); + if (err != KV_ERR_NONE) { + return err; + } + + kv_mgr_ctl_build(); + + printf("fresh: %d\n", KV_MGR_BLK_NUM_FRESH); + printf("hanging: %d\n", KV_MGR_BLK_NUM_HANGING); + printf("inuse: %d\n", KV_MGR_BLK_NUM_INUSE); + printf("total: %d\n", KV_MGR_BLK_NUM_TOTAL); + + return kv_mgr_workspace_locate(); +} + +__API__ kv_err_t tos_kv_deinit(void) +{ + kv_mgr_ctl_deinit(); + return KV_ERR_NONE; +} + +__API__ kv_err_t tos_kv_set(const char *key, const void *value, size_t value_len) +{ + kv_err_t err; + kv_item_t *item; + + if (!key || !value) { + return KV_ERR_INVALID_PARAM; + } + + if (strlen(key) >= (uint8_t)-1 || + value_len >= (uint16_t)-1) { + return KV_ERR_SIZE_EXCEEDED; + } + + kv_lock(); + + item = kv_item_find(key); + if (item) { // already exist + err = kv_item_update(item, key, value, value_len); + kv_item_free(item); + } else { + err = kv_item_save(key, value, value_len, K_NULL); + } + + kv_unlock(); + + return err; +} + +__API__ kv_err_t tos_kv_get(const char *key, void *value_buf, size_t value_buf_size, size_t *value_len) +{ + uint8_t k_len; + uint16_t v_len; + kv_item_t *item; + + if (!key || !value_buf || !value_len) { + return KV_ERR_INVALID_PARAM; + } + + if (strlen(key) >= (uint8_t)-1) { + return KV_ERR_SIZE_EXCEEDED; + } + + kv_lock(); + + item = kv_item_find(key); + if (!item) { + kv_unlock(); + return KV_ERR_NOT_EXIST; + } + + kv_unlock(); + + k_len = item->hdr.k_len; + v_len = item->hdr.v_len; + *value_len = v_len; + + if (value_buf_size < v_len) { + kv_item_free(item); + return KV_ERR_BUF_TOO_SHORT; + } + + memcpy(value_buf, item->body + k_len, v_len); + kv_item_free(item); + + return KV_ERR_NONE; +} + +__API__ int tos_kv_has_key(const char *key) +{ + int has_key; + + if (!key) { + return KV_ERR_INVALID_PARAM; + } + + if (strlen(key) >= (uint8_t)-1) { + return KV_ERR_SIZE_EXCEEDED; + } + + kv_lock(); + has_key = kv_item_find(key) ? K_TRUE : K_FALSE; + kv_unlock(); + + return has_key; +} + +__API__ kv_err_t tos_kv_del(const char *key) +{ + kv_err_t err; + kv_item_t *item; + + if (!key) { + return KV_ERR_INVALID_PARAM; + } + + if (strlen(key) >= (uint8_t)-1) { + return KV_ERR_SIZE_EXCEEDED; + } + + kv_lock(); + + item = kv_item_find(key); + if (!item) { + kv_unlock(); + return KV_ERR_NOT_EXIST; + } + + err = kv_item_delete(item); + kv_item_free(item); + + kv_unlock(); + + return err; +} + diff --git a/examples/kv/kv_sample.c b/examples/kv/kv_sample.c new file mode 100644 index 00000000..9fadb755 --- /dev/null +++ b/examples/kv/kv_sample.c @@ -0,0 +1,105 @@ +#include "tos_kv.h" + +#include "cmsis_os.h" + +#define TASK_STK_SIZE 2048 +void task(void *arg); +osThreadDef(task, osPriorityNormal, 1, TASK_STK_SIZE); + +// #define USING_ONCHIP_FLASH + +#ifdef USING_ONCHIP_FLASH +extern kv_flash_drv_t stm32l4_norflash_onchip_drv; +extern kv_flash_prop_t stm32l4_norflash_onchip_prop; +#else +extern kv_flash_drv_t stm32l4_qspiflash_drv; +extern kv_flash_prop_t stm32l4_qspiflash_prop; +#endif + +void disp_value(uint8_t *value, uint32_t value_len) +{ + int i = 0; + + printf("value_len: %d\n", value_len); + + printf("\""); + for (i = 0; i < value_len; ++i) { + printf("%c", value[i]); + } + printf("\"\n\n"); +} + +void task(void *arg) +{ + int has_key; + kv_err_t err; + uint8_t value_buf[40]; + uint32_t value_len; + +#ifndef USING_ONCHIP_FLASH // use qspiflash + extern void MX_QUADSPI_Init(void); + MX_QUADSPI_Init(); +#endif + +#if 0 + stm32l4_norflash_onchip_erase(0x803d000, 2048); + stm32l4_norflash_onchip_erase(0x803d000 + 2048, 2048); + return; +#endif + +#ifdef USING_ONCHIP_FLASH + err = tos_kv_init(&stm32l4_norflash_onchip_drv, &stm32l4_norflash_onchip_prop); + printf("kv init, rc: %d\n", err); +#else + err = tos_kv_init(&stm32l4_qspiflash_drv, &stm32l4_qspiflash_prop); + printf("kv init, rc: %d\n", err); +#endif + + has_key = tos_kv_has_key("key00"); + printf("has key[%s] ? %s\n\n", "key00", has_key ? "True" : "False"); + + err = tos_kv_set("key00", "value_00", strlen("value_00")); + printf("kv set(%s), rc: %d\n\n", "key00", err); + + has_key = tos_kv_has_key("key00"); + printf("has key[%s] ? %s\n\n", "key00", has_key ? "True" : "False"); + + if (err == KV_ERR_NONE) { + err = tos_kv_get("key00", value_buf, sizeof(value_buf), &value_len); + printf("kv get(%s), rc: %d\n\n", "key00", err); + + if (err == KV_ERR_NONE) { + disp_value(value_buf, value_len); + } + + tos_kv_walkthru(); + } + + err = tos_kv_set("key00", "value_xx", strlen("value_xx")); + printf("kv set(%s), rc: %d\n\n", "key00", err); + + if (err == KV_ERR_NONE) { + err = tos_kv_get("key00", value_buf, sizeof(value_buf), &value_len); + printf("kv get(%s), rc: %d\n\n", "key00", err); + + if (err == KV_ERR_NONE) { + disp_value(value_buf, value_len); + } + + tos_kv_walkthru(); + } + + err = tos_kv_del("key00"); + printf("kv del(%s), rc: %d\n\n", "key00", err); + + has_key = tos_kv_has_key("key00"); + printf("has key[%s] ? %s\n\n", "key00", has_key ? "True" : "False"); + + tos_kv_walkthru(); +} + +void application_entry(void *arg) +{ + osThreadCreate(osThread(task), NULL); // Create task1 +} + diff --git a/kernel/core/include/tos_task.h b/kernel/core/include/tos_task.h index 13f24344..da773297 100644 --- a/kernel/core/include/tos_task.h +++ b/kernel/core/include/tos_task.h @@ -61,7 +61,7 @@ typedef void (*k_task_entry_t)(void *arg); -typedef void (*k_task_walker)(k_task_t *task); +typedef void (*k_task_walker_t)(k_task_t *task); /** * task control block @@ -339,7 +339,7 @@ __API__ k_err_t tos_task_stack_draught_depth(k_task_t *task, int *depth); * * @return None */ -__API__ void tos_task_walkthru(k_task_walker walker); +__API__ void tos_task_walkthru(k_task_walker_t walker); /** * @brief A debug API for display all tasks information. diff --git a/kernel/core/tos_mmheap.c b/kernel/core/tos_mmheap.c index 48a0432c..bb98073a 100644 --- a/kernel/core/tos_mmheap.c +++ b/kernel/core/tos_mmheap.c @@ -191,7 +191,7 @@ __STATIC_INLINE__ void *blk_to_ptr(const mmheap_blk_t *blk) } /* Return location of next block after block of given size. */ -__STATIC_INLINE__ mmheap_blk_t *offset_to_block(const void *ptr, int diff) +__STATIC_INLINE__ mmheap_blk_t *offset_to_blk(const void *ptr, int diff) { return (mmheap_blk_t *)((cpu_addr_t)ptr + diff); } @@ -207,7 +207,7 @@ __STATIC__ mmheap_blk_t *blk_next(const mmheap_blk_t *blk) { mmheap_blk_t *next_blk; - next_blk = offset_to_block(blk_to_ptr(blk), blk_size(blk) - K_MMHEAP_BLK_HEADER_OVERHEAD); + next_blk = offset_to_blk(blk_to_ptr(blk), blk_size(blk) - K_MMHEAP_BLK_HEADER_OVERHEAD); return next_blk; } @@ -331,7 +331,7 @@ __STATIC__ mmheap_blk_t *blk_split(mmheap_blk_t *blk, size_t size) size_t remain_size; /* Calculate the amount of space left in the remaining block. */ - remaining = offset_to_block(blk_to_ptr(blk), size - K_MMHEAP_BLK_HEADER_OVERHEAD); + remaining = offset_to_blk(blk_to_ptr(blk), size - K_MMHEAP_BLK_HEADER_OVERHEAD); remain_size = blk_size(blk) - (size + K_MMHEAP_BLK_HEADER_OVERHEAD); blk_set_size(remaining, remain_size); @@ -735,7 +735,7 @@ __API__ k_err_t tos_mmheap_pool_add(void *pool_start, size_t pool_size) ** so that the prev_phys_block field falls outside of the pool - ** it will never be used. */ - curr_blk = offset_to_block(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD); + curr_blk = offset_to_blk(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD); blk_set_size(curr_blk, size_aligned); blk_set_free(curr_blk); blk_set_prev_used(curr_blk); @@ -763,7 +763,7 @@ __API__ k_err_t tos_mmheap_pool_rmv(void *pool_start) return K_ERR_MMHEAP_POOL_NOT_EXIST; } - blk = offset_to_block(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD); + blk = offset_to_blk(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD); mapping_insert(blk_size(blk), &fl, &sl); remove_free_block(blk, fl, sl); @@ -780,7 +780,7 @@ __API__ k_err_t tos_mmheap_pool_check(void *pool_start, k_mmheap_info_t *info) memset(info, 0, sizeof(k_mmheap_info_t)); - blk = offset_to_block(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD); + blk = offset_to_blk(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD); while (blk && !blk_is_last(blk)) { if (blk_is_free(blk)) { diff --git a/kernel/core/tos_task.c b/kernel/core/tos_task.c index 0f073463..e278d560 100644 --- a/kernel/core/tos_task.c +++ b/kernel/core/tos_task.c @@ -547,7 +547,7 @@ __API__ k_task_t *tos_task_curr_task_get(void) return curr_task; } -__API__ void tos_task_walkthru(k_task_walker walker) +__API__ void tos_task_walkthru(k_task_walker_t walker) { TOS_CPU_CPSR_ALLOC(); k_task_t *task;