gawaskar kanagaraj / Mbed 2 deprecated Nucleo_printf

Dependencies:   mbed

Committer:
gawas
Date:
Fri Aug 23 16:43:44 2019 +0000
Revision:
0:ccdea31d8eba
init funtion;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gawas 0:ccdea31d8eba 1 #include <stm32f4xx_hal.h>
gawas 0:ccdea31d8eba 2
gawas 0:ccdea31d8eba 3 #include "process.h"
gawas 0:ccdea31d8eba 4 #include "kernel/context.h"
gawas 0:ccdea31d8eba 5 #include "kernel/part_scheduler.h"
gawas 0:ccdea31d8eba 6 #include "types.h"
gawas 0:ccdea31d8eba 7
gawas 0:ccdea31d8eba 8
gawas 0:ccdea31d8eba 9 static size_t find_dormant_process(process_t *processes, size_t nb_proc)
gawas 0:ccdea31d8eba 10 {
gawas 0:ccdea31d8eba 11 for (size_t i = 0; i < nb_proc; ++i) {
gawas 0:ccdea31d8eba 12 if(processes[i].PROCESS_STATE == DORMANT) {
gawas 0:ccdea31d8eba 13 return i;
gawas 0:ccdea31d8eba 14 }
gawas 0:ccdea31d8eba 15 }
gawas 0:ccdea31d8eba 16
gawas 0:ccdea31d8eba 17 return -1;
gawas 0:ccdea31d8eba 18 }
gawas 0:ccdea31d8eba 19
gawas 0:ccdea31d8eba 20
gawas 0:ccdea31d8eba 21 void create_process(partition_t *partition, uint32_t memoryAddress, PROCESS_ATTRIBUTE_TYPE* attributes, PROCESS_ID_TYPE* processId, RETURN_CODE_TYPE *RETURN_CODE)
gawas 0:ccdea31d8eba 22 {
gawas 0:ccdea31d8eba 23 /* TODO: memoryAddress should be calculated and not given */
gawas 0:ccdea31d8eba 24 const int i = find_dormant_process(partition->processes, MAX_PROCESSES_PER_PARTITIONS);
gawas 0:ccdea31d8eba 25
gawas 0:ccdea31d8eba 26 if (i == -1) {
gawas 0:ccdea31d8eba 27 *RETURN_CODE = NOT_AVAILABLE;
gawas 0:ccdea31d8eba 28 return;
gawas 0:ccdea31d8eba 29 }
gawas 0:ccdea31d8eba 30 *RETURN_CODE = NO_ERROR;
gawas 0:ccdea31d8eba 31
gawas 0:ccdea31d8eba 32 *processId = i;
gawas 0:ccdea31d8eba 33 process_t *process = &partition->processes[i];
gawas 0:ccdea31d8eba 34
gawas 0:ccdea31d8eba 35 process->ATTRIBUTES = *attributes;
gawas 0:ccdea31d8eba 36 process->CURRENT_PRIORITY = attributes->BASE_PRIORITY;
gawas 0:ccdea31d8eba 37 attributes->STACK_SIZE = 1024;
gawas 0:ccdea31d8eba 38 /* Should it maybe be "-" sizeof(ARM_context_state) on the following line? */
gawas 0:ccdea31d8eba 39 process->stackpointer = memoryAddress + sizeof(ARM_context_state);
gawas 0:ccdea31d8eba 40 process->exc_return_value = 0xFD;
gawas 0:ccdea31d8eba 41 process->tickStamp = HAL_GetTick();
gawas 0:ccdea31d8eba 42
gawas 0:ccdea31d8eba 43 context_setup(attributes->ENTRY_POINT, (void *) process->stackpointer);
gawas 0:ccdea31d8eba 44
gawas 0:ccdea31d8eba 45 process->PROCESS_STATE = READY;
gawas 0:ccdea31d8eba 46 }
gawas 0:ccdea31d8eba 47
gawas 0:ccdea31d8eba 48
gawas 0:ccdea31d8eba 49 void runtime_create_process(PROCESS_ATTRIBUTE_TYPE *attributes, PROCESS_ID_TYPE *processId, RETURN_CODE_TYPE *RETURN_CODE)
gawas 0:ccdea31d8eba 50 {
gawas 0:ccdea31d8eba 51 partition_t *partition = getActivePartition();
gawas 0:ccdea31d8eba 52 int32_t id = partition->id;
gawas 0:ccdea31d8eba 53
gawas 0:ccdea31d8eba 54 /* Find overall memmory structure for this partition. */
gawas 0:ccdea31d8eba 55 part_mem_t *p_mem = {0};
gawas 0:ccdea31d8eba 56 const uint32_t nb_mems = sizeof(partition_memory) / sizeof(part_mem_t);
gawas 0:ccdea31d8eba 57 for (size_t i = 0; i < nb_mems; i++) {
gawas 0:ccdea31d8eba 58 if (partition_memory[i].id == id) {
gawas 0:ccdea31d8eba 59 p_mem = &partition_memory[i];
gawas 0:ccdea31d8eba 60 }
gawas 0:ccdea31d8eba 61 }
gawas 0:ccdea31d8eba 62
gawas 0:ccdea31d8eba 63
gawas 0:ccdea31d8eba 64 /* If not found data is missing, return error. */
gawas 0:ccdea31d8eba 65 if (p_mem->id == 0) {
gawas 0:ccdea31d8eba 66 *RETURN_CODE = INVALID_CONFIG;
gawas 0:ccdea31d8eba 67 return;
gawas 0:ccdea31d8eba 68 }
gawas 0:ccdea31d8eba 69
gawas 0:ccdea31d8eba 70 /* Get the DATA memory requirements for this partition. */
gawas 0:ccdea31d8eba 71 mem_req_t *data_mem = {0};
gawas 0:ccdea31d8eba 72 for (size_t i = 0; i < p_mem->arr_size; i++) {
gawas 0:ccdea31d8eba 73 if (p_mem->memory_arr[i].type == DATA) {
gawas 0:ccdea31d8eba 74 data_mem = &p_mem->memory_arr[i];
gawas 0:ccdea31d8eba 75 }
gawas 0:ccdea31d8eba 76 }
gawas 0:ccdea31d8eba 77
gawas 0:ccdea31d8eba 78 /* Data is invalid or missing, return error. */
gawas 0:ccdea31d8eba 79 if (data_mem->size == 0) {
gawas 0:ccdea31d8eba 80 *RETURN_CODE = INVALID_CONFIG;
gawas 0:ccdea31d8eba 81 return;
gawas 0:ccdea31d8eba 82 }
gawas 0:ccdea31d8eba 83
gawas 0:ccdea31d8eba 84 const uint32_t mem_size = attributes->STACK_SIZE;
gawas 0:ccdea31d8eba 85 /* Not enough space, return error. */
gawas 0:ccdea31d8eba 86 if ((mem_size + p_mem->mem_offset) > data_mem->size) {
gawas 0:ccdea31d8eba 87 *RETURN_CODE = INVALID_PARAM;
gawas 0:ccdea31d8eba 88 return;
gawas 0:ccdea31d8eba 89 }
gawas 0:ccdea31d8eba 90
gawas 0:ccdea31d8eba 91
gawas 0:ccdea31d8eba 92 p_mem->mem_offset += mem_size;
gawas 0:ccdea31d8eba 93 const uint32_t addr = data_mem->address + p_mem->mem_offset;
gawas 0:ccdea31d8eba 94
gawas 0:ccdea31d8eba 95 create_process(partition, addr, attributes, processId, RETURN_CODE);
gawas 0:ccdea31d8eba 96 }
gawas 0:ccdea31d8eba 97