]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blob - pmsm-control/test_sw/misc.c
906e29c7ca4ea1bd12c26300e31c38a69be61223
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / misc.c
1 /**
2  * \brief Implementace pomocnych funkci.
3  * \file misc.c
4  * \date Feb 1, 2015
5  * \author Martin Prudek
6  *
7  *      Implementace pomocnych funkci.
8  *      Vetsinou pro komunikaci mezi vlakny, jejich sychronizaci a predavani priorit.
9  */
10
11
12 #include <sched.h>
13 #include <signal.h>     /*signal handler*/
14 #include <stdlib.h>
15 #include <stdio.h>      /*printf*/
16 #include <pthread.h>
17 #include <sys/mman.h>   /*mlockall*/
18
19 #include "misc.h"
20
21
22
23 /**
24  * \brief
25  * Signal handler.
26  */
27 void appl_sig_handler(int sig){
28         appl_stop();
29         exit(1);
30 }
31
32 /*
33  * \brief Setup initial environment.
34  */
35 void setup_environment(){
36         /*struktura pro signal handler*/
37         struct sigaction sighnd;
38
39         if (mlockall(MCL_FUTURE | MCL_CURRENT) < 0) {
40             fprintf(stderr, "mlockall failed - cannot lock application in memory\n");
41             exit(1);
42          }
43
44         atexit(appl_stop);
45
46         /*nastaveni signalu pro vypnuti pomoci Ctrl+C*/
47         sighnd.sa_handler=appl_sig_handler;
48         sigaction(SIGINT, &sighnd, NULL );
49 }
50
51 /*
52  * \brief
53  * Creates RT thread
54  */
55 int create_rt_task(pthread_t *thread, int prio, void *(*start_routine) (void *), void *arg){
56         int ret ;
57
58         pthread_attr_t attr;
59         struct sched_param schparam;
60
61         /*inicializace implicitnich atributu*/
62         if (pthread_attr_init(&attr) != 0) {
63                 fprintf(stderr, "pthread_attr_init failed\n");
64                 return -1;
65         }
66
67         /*nastavi dedeni planovace z attr*/
68         if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) != 0) {
69                 fprintf(stderr, "pthread_attr_setinheritsched failed\n");
70                 return -1;
71         }
72
73         /*nastaveni planovace*/
74         if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO) != 0) {
75                 fprintf(stderr, "pthread_attr_setschedpolicy SCHED_FIFO failed\n");
76                 return -1;
77         }
78
79         schparam.sched_priority = prio;
80
81         /*nastavit atribut attr podle hodnoty schparam*/
82         if (pthread_attr_setschedparam(&attr, &schparam) != 0) {
83                 fprintf(stderr, "pthread_attr_setschedparam failed\n");
84                 return -1;
85         }
86
87         /*vytvori vlakno*/
88         ret = pthread_create(thread, &attr, start_routine, arg);
89
90         /*uvolni strukturu, nema vliv na vlakna jiz vytvorena*/
91         pthread_attr_destroy(&attr);
92
93         return ret;
94 }
95
96
97