c - freeRTOS 进程切换
问题描述
我尝试执行一项任务,即创建 2 个任务。第一个任务是每 95 毫秒循环运行一次,占用 30 毫秒的处理器时间,第二个任务是循环运行长达 33 毫秒,占用 15 毫秒的处理器时间。我在调整函数时遇到问题,以便它需要作为函数参数给出的正确时间。应该使用软件计时器还是eclipse中有功能计时工具?
主.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;
}
实验室1.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();
}
解决方案
根据 RMA/RMS,您似乎超出了可调度性限制。您的 CPU 利用率为 30/95 + 15/33 == 0.77,大于 ln(2)。你的任务不是和谐的,所以你可能有一组“不可调度”的任务。(请用谷歌搜索 RMA/RMS 或“可调度性限制”)。
推荐阅读
- c# - FluentValidation 如何创建公共部分
- java - 覆盖在 FirebaseMessagingService 中的 onNewTask() 不起作用
- druid - Apache Druid sql 查询转换为基于 json 的查询
- go - 检查对 fmt.Errorf() 的调用是否失败
- google-apps-script - 谷歌脚本:从库中定义变量
- java - 具有随机整数的数组
- delphi - 将 InputComboBox 的 KeyPress 事件作为函数参数传递
- go - 来自多个测试用例的类似 sqlmock 期望导致错误失败
- python - Excel 行到句子 Python
- ruby-on-rails - 在 VueJS 中为具有不同类型的道具设置默认值