Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/kernel/process.c@0:ccdea31d8eba, 2019-08-23 (annotated)
- Committer:
 - gawas
 - Date:
 - Fri Aug 23 16:43:44 2019 +0000
 - Revision:
 - 0:ccdea31d8eba
 
init funtion;
Who changed what in which revision?
| User | Revision | Line number | New 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 |