Forum: Mikrocontroller und Digitale Elektronik uC/OS-III - OSTmrCreate


von OsUser (Gast)


Lesenswert?

Guten Morgen,

auf einem ST Mikrocontroller läuft das RTOS uC/OS-III. Die Task wird auf 
korrekt ausgeführt. Nun möchte ich das ganze erweitern und einen OS 
Timer vom uC/OS-III benutzen. Die Initialisierung sowie Start wird in 
der Task ausgeführt. Allerdings wird nicht in die Funktion "Fnct" 
gesprungen.
Wo könnte da das Problem liegen ?
1
static  OS_TCB   AppTaskStartTCB;
2
static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];
3
4
static  void  AppTaskStart  (void *p_arg);
5
6
static  OS_TMR Tmr;
7
void Fnct(void);
8
9
10
int main(void)
11
{
12
    OS_ERR  err;
13
14
    /* Setup STM32 system (clock, PLL and Flash configuration) */
15
    BSP_IntDisAll();                                            /* Disable all interrupts.                              */
16
17
    OSInit(&err);                                               /* Init uC/OS-III.                                      */
18
19
    OSTaskCreate((OS_TCB    *)&AppTaskStartTCB,                 /* Create the start task                                */
20
                 (CPU_CHAR  *)"App Task Start",
21
                 (OS_TASK_PTR)AppTaskStart,
22
                 (void      *)0,
23
                 (OS_PRIO    )APP_TASK_START_PRIO,
24
                 (CPU_STK   *)&AppTaskStartStk[0],
25
                 (CPU_STK   *)&AppTaskStartStk[APP_TASK_START_STK_SIZE / 10],
26
                 (OS_STK_SIZE)APP_TASK_START_STK_SIZE,
27
                 (OS_MSG_QTY )0,
28
                 (OS_TICK    )0,
29
                 (void      *)0,
30
                 (OS_OPT     )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
31
                 (OS_ERR    *)&err);
32
33
    OSStart(&err);                                              /* Start multitasking (i.e. give control to uC/OS-III). */
34
    return (0);
35
}
36
37
static  void  AppTaskStart (void *p_arg)
38
{
39
    CPU_INT32U  cpu_clk_freq;
40
    CPU_INT32U  cnts;
41
    OS_ERR      err;
42
43
   (void)p_arg;
44
45
    BSP_Init();                                                   /* Initialize BSP functions                         */
46
    CPU_Init();                                                   /* Initialize the uC/CPU services                   */
47
48
    cpu_clk_freq = BSP_CPU_ClkFreq();                             /* Determine SysTick reference freq.                */
49
    cnts         = cpu_clk_freq / (CPU_INT32U)10000; //OSCfg_TickRate_Hz;  /* Determine nbr SysTick increments                 */
50
    OS_CPU_SysTickInit(cnts);                                     /* Init uC/OS periodic time src (SysTick).          */
51
52
#if OS_CFG_STAT_TASK_EN > 0u
53
    OSStatTaskCPUUsageInit(&err);                                 /* Compute CPU capacity with no task running        */
54
#endif
55
56
    CPU_IntDisMeasMaxCurReset();    
57
58
    OSTmrCreate((OS_TMR   *)&Tmr,
59
               (CPU_CHAR *)"Timer",
60
                 (OS_TICK   )10,
61
                 (OS_TICK   )100,
62
                 (OS_OPT    )OS_OPT_TMR_PERIODIC,
63
                 (OS_TMR_CALLBACK_PTR)Fnct,
64
                 (void     *)0,
65
                 (OS_ERR   *)&err);
66
67
    CPU_BOOLEAN status;
68
    status = OSTmrStart((OS_TMR *)&Tmr, &err);
69
70
    while (DEF_TRUE)
71
    { 
72
  Led_Toggle(1);
73
    }
74
}
75
76
77
void Fnct(void)
78
{
79
  Led_Toggle(2);
80
}

von Guest (Gast)


Lesenswert?

OsUser schrieb:
> auf einem ST Mikrocontroller läuft das RTOS uC/OS-III.

Da liegt schon der Fehler ;-).
Nimm embOS und es wird funktionieren.

Spaß beseite, ich kenne jetzt die API von uC/OS-III nicht, aber kann es 
sein, das du in der Callback Funktion eine Retrigger Funktion aufrufen 
musst?
Kommst du denn in der Funktion nur einmal an oder nie?

von OsUser (Gast)


Angehängte Dateien:

Lesenswert?

Danke für deine Antwort. Die Funktion wird nie angesprungen.
In einer anderen Applikation (UC/OS-III + Lwip) da funktioniert der 
Timer bzw. die Funktion Fnct wird angesprungen. In der Headerdatei 
"os_cfg.h" gibt es ein DEFINE OS_CFG_TMR_EN. Dieses DEFINE hat den Wert 
1. Was mir nun aufgefallen ist, dass in den einzelnen uC/OS-III 
Quelldateien, dieses DEFINE keine Auswirkungen hat, obwohl die Pfade 
stimmen. (Siehe z.B. os_tmr.h)

Was müsste ich genau tun, damit dieses DEFINE in den Quelldateien wie 
z.B. os_tmr.h vorhanden ist ?

von Tom (Gast)


Lesenswert?

Wie bei uC/OS-III muss man sowas per Define auch noch konfigurieren?
Was für ein Murks.
Da kann ich Guest nur recht geben, ich arbeite auch mit embOS und da 
funktioneren solche Sachen einfach ohne das man sich Gedanken darüber 
machen muss.
Aber das hilft dir wohl gerade nicht weiter.
Wird denn die os_cfg.h von den C Dateien überhaupt inkludiert?

>Was müsste ich genau tun, damit dieses DEFINE in den Quelldateien wie
>z.B. os_tmr.h vorhanden ist ?
Entweder muss das Define in der Datei os_tmr.h gesetzt werden, oder in 
einer Headerdatei, die von os_tmr.h inkludiert wird oder es muss als 
Preprocessor Symbol gesetzt werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.