Forum: Mikrocontroller und Digitale Elektronik FreeRTOS auf uC KL25Z mittels KDS Implementieren


von Thomas K. (kise1990)


Lesenswert?

Guten Tag,

ich habe ein Projekt wo letztenlich FreeRTOS auf einem FRDM-KL25Z Board 
implementiert werden soll. Dazu hätte ich einige Fragen.

1. Ich würde gerne mittels zweier Threads die LED auf dem Board 
ansprechen wollen. Mache ich es ohne Threads Funktioniert mein Code. Mit 
Threads jedoch nicht. könnt Ihr mir sagen was ich ggf. falsch gemacht 
habe?

1
#include <string.h>
2
3
#include "board.h"
4
#include "pin_mux.h"
5
#include "clock_config.h"
6
/*#include "fsl_debug_console.h"*/
7
8
#include "fsl_gpio.h"
9
#include "fsl_device_registers.h"
10
#include "fsl_port.h"
11
12
/* FreeRTOS kernel includes. */
13
#include "FreeRTOS.h"
14
#include "task.h"
15
#include "queue.h"
16
#include "timers.h"
17
18
//#define task_1 (tskIDLE_PRIORITY + 1)
19
static void task_1(void *pvParameters);
20
static void task_2(void *pvParameters);
21
//#define task_2 (configMAX_PRIORITIES - 1)
22
23
/*static void delay(volatile uint32_t nof) {
24
  while(nof!=0) {
25
    __asm("NOP");
26
    nof--;
27
  }
28
}
29
*/
30
/* Task priorities. */
31
//#define hello_task_PRIORITY (configMAX_PRIORITIES - 1)
32
33
/*!
34
 * @brief Application entry point.
35
 */
36
int main(void) {
37
  /* Init board hardware. */
38
  BOARD_InitPins();
39
  BOARD_BootClockRUN();
40
  BOARD_InitDebugConsole();
41
42
  xTaskCreate(task_1, "task_1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
43
  xTaskCreate(task_2, "task_2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
44
  vTaskStartScheduler();
45
46
  /* Add your code here */
47
48
  /* Create RTOS task */
49
 // xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE, NULL, hello_task_PRIORITY, NULL);
50
 // vTaskStartScheduler();
51
52
  for(;;) { /* Infinite loop to avoid leaving the main function */
53
    __asm("NOP"); /* something to use as a breakpoint stop while looping */
54
  }
55
}
56
57
static void task_1(void *pvParameters)
58
{
59
  const TickType_t xDelay = 1000 / portTICK_PERIOD_MS;
60
    while (1)
61
    {
62
      GPIO_ClearPinsOutput(GPIOB, 1<<18u); /* red led on */
63
      vTaskDelay( xDelay);
64
      //delay(800000; //taskYIELD();
65
      GPIO_SetPinsOutput(GPIOB, 1<<18u); /* red led off */
66
      vTaskDelay( xDelay);
67
      //delay(800000); //taskYIELD();
68
    }
69
}
70
71
static void task_2(void *pvParameters)
72
{
73
  const TickType_t xDelay = 800 / portTICK_PERIOD_MS;
74
    while (1)
75
    {
76
      GPIO_ClearPinsOutput(GPIOB, 1<<19u); /* green led on */
77
      vTaskDelay( xDelay);//delay(1000000);//taskYIELD();
78
      GPIO_SetPinsOutput(GPIOB, 1<<19u); /* green led off */
79
      vTaskDelay( xDelay);//taskYIELD();//delay(1000000);
80
    }
81
}

2. Es gibt bestehende Codewarrior Projekte, welche zu Kinetis Design 
Studio convertiert werden sollen. Obwohl ich nach dieser 
Anleitung(http://www.nxp.com/files/microcontrollers/doc/user_guide/KDSPUG.pdf?fasp=1&WT_TYPE=Users%20Guides&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf) 
vorgehe, bekomme ich immer noch eine Fehlermeldung. Hat jemand 
erfolgreich CW-Projekte in KDS Convertiert? Wenn ja würde ich meine 
Fehlermeldung im nachhinein erläutern.

3. In dem SDK sind Beispielprojekte hinterlegt, mit unteranderem ein 
Eventbeispiel. Meines wissens gibt es ja Event gesteuerte Tasks sowie 
periodisch gesteuerte Tasks. In diesem Beispiel werden offensichtlich 
Event gesteuerte Tasks verwendet. Nur stellt sich mir die Frage, wer 
festlegt in welchen Abständen diese aufgerufen werden. Ich habe über 
einen SystickTimer gelesen, welche ein PreloadRegister besitzt.Je nach 
Einstellung von diesem Wert läuft der Timer früher oder später ab. 
Daraus wird der Grundtackt des Betriebssystems bestimmt. Alle weiteren 
Timer sind SW-Timer die mit diesem Wert arbeiten. Somit kann man die 
Periode von Interrupts festlegen, die von diesem Timer erzeugt werden. 
So viel zur Theorie ob das Praktisch so Funktioniert kann ich noch nicht 
bestätigen. Sollte man den Systicktimer ändern, welche Auswirkungen hat 
dies auf das restliche System? Wie werden periodische Tasks aufgerufen? 
Über den SystickTimer? Kann man dabei Beispielsweise den Timer auf 1ms 
Einstellen, was dann bedeuten würde das die Tasks jede ms aufgerufen 
werden?

4. Beim Anlegen von einem neuen Projekt, wird eine system_MKL25Z4.h 
Datei angelegt. In dieser wird mit rund 21MHz gearbeitet. Ist es nicht 
vorgesehen oder möglich das man mit dem maximalen Takt arbeitet?

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.