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