【发布时间】:2021-06-05 20:18:22
【问题描述】:
我尝试执行一项任务,即创建 2 个任务。第一个任务是每 95 毫秒循环运行一次,占用 30 毫秒的处理器时间,第二个任务是循环运行长达 33 毫秒,占用 15 毫秒的处理器时间。我在调整函数时遇到问题,以便它需要作为函数参数给出的正确时间。应该使用软件定时器还是eclipse中有功能计时工具?
main.c:
xTaskHandle task1, task2;
int main(int argc, char * argv[]) {
// SystemClock_Config();
HAL_Init();
MX_GPIO_Init();
xTaskCreate(zadanie1, "Zadanie1", 128, "to jest nazwa zadania ", 1, & task1);
xTaskCreate(zadanie2, "Zadanie2", 256, "to jest nazwa zadania ", 1, & task2);
vTaskStartScheduler();
return 0;
}
lab1.c:
int iCPU_work(int czas_obliczen_ms) {
int a, b, wynik = 0;
for (int i = 0; i < czas_obliczen_ms; i++) {
a++;
b++;
wynik = a + b;
}
return wynik;
}
void zadanie1(void * parametry) {
char nazwa_zadania[16];
portTickType OstatnieWywolanie = 0;
strncpy(nazwa_zadania, (char * ) parametry, 15);
for (;;) {
iCPU_work(30);
LED1_TOGGLE();
vTaskDelayUntil( & OstatnieWywolanie, 95);
printf(nazwa_zadania);
}
vTaskDelete(NULL); // usuwa zadanie
}
void zadanie2(void * parametry) {
portTickType OstatnieWywolanie = 0;
char nazwa_zadania[16];
strncpy(nazwa_zadania, (char * ) parametry, 15);
for (;;) {
iCPU_work(15);
LED2_TOGGLE();
vTaskDelayUntil( & OstatnieWywolanie, 33);
printf(nazwa_zadania);
}
vTaskDelete(NULL);
}
void vApplicationIdleHook(void) {
LED3_TOGGLE();
}
void vApplicationTickHook(void) {
LED4_TOGGLE();
}
【问题讨论】:
-
根据您使用的滴答频率,您也许可以使用 xTaskGetTickCount 进行忙循环来测量经过的时间。
-
几个文件范围变量,用于存储任务上次运行的时间,以及几个信号量?当每个任务开始时,存储时间。当每个任务完成时,参考另一个任务上次运行的时间,计算下一个任务运行的延迟时间,休眠该时间,发出另一个任务的信号量并等待刚刚运行的任务的信号量。无需忙于等待。
-
@unwind 如果
configUSE_TIME_SLICING == 1,使用xTaskGetTickCount模拟CPU 负载并不容易。在这种情况下,所有具有相同优先级的任务都以循环方式在每个滴答中切换,并且给定的任务将按比例使用更少的 CPU 时间 -
@MartinJames 是的,你是对的——除了实验室工作是关于使用繁忙循环进行 CPU 负载模拟的情况。
标签: c operating-system embedded scheduling freertos