drake  1.0.0
include/drake/platform.h
Go to the documentation of this file.
00001 /*
00002  Copyright 2015 Nicolas Melot
00003 
00004  This file is part of Drake.
00005 
00006  Drake is free software: you can redistribute it and/or modify
00007  it under the terms of the GNU General Public License as published by
00008  the Free Software Foundation, either version 3 of the License, or
00009  (at your option) any later version.
00010 
00011  Drake is distributed in the hope that it will be useful,
00012  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014  GNU General Public License for more details.
00015 
00016  You should have received a copy of the GNU General Public License
00017  along with Drake. If not, see <http://www.gnu.org/licenses/>.
00018 
00019 */
00020 
00021 
00022 #include <stddef.h>
00023 
00024 #include <drake/task.h>
00025 #include <drake/schedule.h>
00026 
00027 #ifndef DRAKE_PLATFORM_H
00028 #define DRAKE_PLATFORM_H
00029 
00031 #define drake_platform_stream_create(stream, application) \
00032 void* (drake_function(application))(size_t id, task_status_t state); \
00033 void (drake_schedule_init(application))(drake_schedule_t*); \
00034 void (drake_schedule_destroy(application))(drake_schedule_t*); \
00035 int (drake_task_number(application))(); \
00036 char* (drake_task_name(application))(size_t); \
00037 drake_platform_stream_create_explicit(stream, PELIB_##CONCAT_2(drake_schedule_init_, application), PELIB_##CONCAT_2(drake_schedule_destroy_, application), PELIB_CONCAT_2(drake_function_, application))
00038 
00040 typedef struct drake_time *drake_time_t;
00042 typedef struct drake_platform *drake_platform_t;
00044 typedef struct drake_power *drake_power_t;
00046 size_t drake_platform_shared_size();
00048 size_t drake_platform_shared_align();
00050 size_t drake_platform_private_size();
00052 drake_platform_t drake_platform_init(void*);
00054 int drake_platform_destroy(drake_platform_t);
00060 volatile void* drake_platform_shared_malloc(size_t size, size_t core);
00061 volatile void* drake_platform_shared_malloc_mailbox(size_t size, size_t core);
00063 void drake_platform_shared_free(volatile void* addr, size_t core);
00065 void* drake_platform_store_malloc(size_t size);
00067 void drake_platform_store_free(void*);
00069 void* drake_platform_private_malloc(size_t size);
00071 void drake_platform_private_free(void*);
00076 void* drake_remote_addr(void* addr, size_t core);
00078 int drake_platform_pull(volatile void* addr);
00080 int drake_platform_commit(volatile void* addr);
00082 size_t drake_platform_core_id();
00084 size_t drake_platform_core_size();
00086 size_t drake_platform_core_max();
00088 void drake_platform_barrier(void*);
00090 void drake_platform_exclusive_begin();
00092 void drake_platform_exclusive_end();
00097 int drake_platform_set_frequency(int frequency /* in KHz */);
00102 int drake_platform_set_frequency_autoscale(int frequency);
00107 int drake_platform_set_voltage(float voltage);
00112 int drake_platform_set_voltage_frequency(drake_platform_t, size_t frequency);
00114 size_t drake_platform_get_frequency(drake_platform_t);
00116 float drake_platform_get_voltage();
00121 int drake_platform_time_get(drake_time_t);
00128 int drake_platform_time_subtract(drake_time_t res, drake_time_t t1, drake_time_t t2);
00135 int drake_platform_time_add(drake_time_t res, drake_time_t t1, drake_time_t t2);
00137 int drake_platform_time_greater(drake_time_t t1, drake_time_t t2);
00139 int drake_platform_time_equals(drake_time_t t1, drake_time_t t2);
00142 int drake_platform_time_init(drake_time_t t, double ms);
00144 FILE* drake_platform_time_printf(FILE* stream, drake_time_t);
00146 void drake_platform_time_destroy(drake_time_t time);
00148 drake_time_t drake_platform_time_alloc();
00153 int drake_platform_sleep(drake_time_t period);
00155 enum drake_power_monitor {DRAKE_POWER_CHIP, DRAKE_POWER_MEMORY_CONTROLLER, DRAKE_POWER_CORE};
00161 drake_power_t drake_platform_power_init(drake_platform_t pt, size_t samples, int measurement);
00165 void drake_platform_power_begin(drake_power_t pwr);
00167 size_t drake_platform_power_end(drake_power_t);
00173 FILE* drake_platform_power_printf(FILE* stream, drake_power_t, char* separator);
00180 FILE* drake_platform_power_printf_line(FILE* stream, drake_power_t, size_t line, char* separator);
00187 FILE* drake_platform_power_printf_cumulate(FILE* stream, drake_power_t, int metrics, char *separator);
00195 FILE* drake_platform_power_printf_line_cumulate(FILE* stream, drake_power_t, size_t line, int metrics, char *separator);
00197 void drake_platform_power_destroy(drake_power_t);
00198 
00199 int drake_platform_stream_create_explicit(drake_platform_t stream, void (*schedule_init)(drake_schedule_t*), void (*schedule_destroy)(drake_schedule_t*), void* (*task_function)(size_t id, task_status_t status));
00200 int drake_platform_stream_init(drake_platform_t stream, void* arg);
00201 int drake_platform_stream_run(drake_platform_t);
00202 int drake_platform_stream_destroy(drake_platform_t);
00203 
00204 void drake_platform_core_disable(drake_platform_t pt, size_t core);
00205 void drake_platform_core_enable(drake_platform_t pt, size_t core);
00206 void drake_platform_sleep_disable(drake_platform_t pt, size_t core);
00207 void drake_platform_sleep_enable(drake_platform_t pt, size_t core);
00208 
00209 #endif // DRAKE_PLATFORM_H