]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blob - pmsm-control/test_sw/misc.c
Modified program exit behavior.
[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         exit(0); /*atexit is set*/
29 }
30
31 /*
32  * \brief Setup initial environment.
33  */
34 void setup_environment(){
35         /*struktura pro signal handler*/
36         struct sigaction sighnd;
37
38         if (mlockall(MCL_FUTURE | MCL_CURRENT) < 0) {
39             fprintf(stderr, "mlockall failed - cannot lock application in memory\n");
40             exit(1);
41          }
42
43         atexit(appl_stop);
44
45         /*nastaveni signalu pro vypnuti pomoci Ctrl+C*/
46         sighnd.sa_handler=appl_sig_handler;
47         sigaction(SIGINT, &sighnd, NULL );
48 }
49
50 /*
51  * \brief
52  * Creates RT thread
53  */
54 int create_rt_task(pthread_t *thread, int prio, void *(*start_routine) (void *), void *arg){
55         int ret ;
56
57         pthread_attr_t attr;
58         struct sched_param schparam;
59
60         /*inicializace implicitnich atributu*/
61         if (pthread_attr_init(&attr) != 0) {
62                 fprintf(stderr, "pthread_attr_init failed\n");
63                 return -1;
64         }
65
66         /*nastavi dedeni planovace z attr*/
67         if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) != 0) {
68                 fprintf(stderr, "pthread_attr_setinheritsched failed\n");
69                 return -1;
70         }
71
72         /*nastaveni planovace*/
73         if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO) != 0) {
74                 fprintf(stderr, "pthread_attr_setschedpolicy SCHED_FIFO failed\n");
75                 return -1;
76         }
77
78         schparam.sched_priority = prio;
79
80         /*nastavit atribut attr podle hodnoty schparam*/
81         if (pthread_attr_setschedparam(&attr, &schparam) != 0) {
82                 fprintf(stderr, "pthread_attr_setschedparam failed\n");
83                 return -1;
84         }
85
86         /*vytvori vlakno*/
87         ret = pthread_create(thread, &attr, start_routine, arg);
88
89         /*uvolni strukturu, nema vliv na vlakna jiz vytvorena*/
90         pthread_attr_destroy(&attr);
91
92         return ret;
93 }
94
95
96