يوم جيد.لقد فهمت برمجة وحدات التحكم الدقيقة Stm32 ، حاولت تثبيت (نظام التشغيل في الوقت الفعلي) RTOS - FreeRTOS وواجهت عددًا من الصعوبات. هناك العديد من المقالات على الإنترنت ، لكنني لم أجد أي تعليمات واضحة ، لذلك أسأل كل شخص مهتم بالقطط.لذا ، بالنسبة للمبتدئين ، دعنا نقرر ما تحتاجه:- مجلس تصحيح الأخطاء Stm32VLDiscovery
- تثبيت IDE Keil ARM 5 وأعلى
- الرغبة في فرز الجديد
إذا كنت قد قمت بالفعل بتطوير أي شيء لعائلة STM32F1x في Keil ، فيمكنك تخطي هذه الفقرة. تحتاج أولاً إلى تثبيت حزم تطوير لعائلة STM32F1x ، ويتم ذلك على النحو التالي:- نطلق Keil.
- انقر على زر Pack Installer في اللوحة

- في النافذة التي تفتح ، انقر فوق الزر التحقق من وجود تحديثات (نحن في انتظار تحديث قائمة الحزم)
- في الشجرة ، حدد STMicroelectronics-> STM32F1 Series-> STM32F100 وقم بتثبيت جميع الحزم
هذا يكمل إعداد بيئة التطوير.ننتقل مباشرة إلى إنشاء المشروع باستخدام FreeRTOS.أول شيء يجب فعله هو تنزيل أحدث توزيع RTOS من الموقع الرسمي www.freertos.org ، في وقت كتابة هذا التقرير ، كان أحدث إصدار FreeRTOSv9.0.0. لذلك حصلنا على أرشيف مثير للإعجاب ، وقم بفك ضغطه إلى أي مكان (سأقول على الفور أننا لا نحتاج إلى 99٪ منه ، لذلك لا تخف من حجم المجلد الناتج لدي أكثر من 200 ميجابايت).الآن نحن بحاجة إلى إنشاء مشروع جديد في Keil.
سمتها FreeRTOSDemo ، يمكنك اختيار أي اسم مناسب ، الشيء الرئيسي هو أنه يجب ألا تكون هناك مسافات وأحرف روسية في مسار المشروع.الآن نحن بحاجة إلى اختيار الشريحة الخاصة بنا ، لقد اختبرت على لوحة تصحيح الأخطاء STM32VLDiscovery مع شريحة STM32F100RB ، لذلك اخترت ذلك.
بعد اختيار شريحة ، تحتاج إلى تحديد المكتبات التي سنستخدمها. سنحتاج إلى مكتبة CMSIS و StdPeriph. توضح الأشكال أدناه الحد الأدنى من اختيار المكونات من أجل التحقق من تشغيل RTOS وامض مع الثنائيات (وهذا ينطبق على مكتبة StdPeriph ، مطلوب CMSIS).

لذلك أنشأنا المشروع ، يبدو كما يلي:
بعد ذلك ، من أجل الراحة ، ننشئ عدة مجموعات في المشروع ، بحيث يكون هناك مزيج من الملفات لاحقًا.
كل شيء جاهز لنسخ ملفات RTOS إلى المشروع. قم بإنشاء مجلد FreeRTOS في مجلد المشروع.من المجلد FreeRTOSv9.0.0 \ FreeRTOS \ Source \ ، انسخ جميع ملفات * .s إلى المجلد FreeRTOS الذي تم إنشاؤه. هناك نقوم بنسخ مجلد التضمين.من المجلد FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ RVDS \ ARM_CM3 \ ، انسخ ملفات * .s و * .h إلى الأماكن المقابلة في مجلد FreeRTOS لمشروعنا.من المجلد FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ MemMang \ ، انسخ ملف heap_2.c.من المجلد FreeRTOSv9.0.0 \ FreeRTOS \ Demo \ CORTEX_STM32F103_Keil \ انسخ الملف FreeRTOSConfig.h.بعد كل التلاعبات ، يجب أن يحدث ما يلي:
بعد ذلك ، نحتاج إلى إضافة الملفات إلى المجموعات المناسبة في المشروع ، وكذلك إنشاء ملف main.cc بالنص الرئيسي للبرنامج.ونتيجة لذلك ، ينبغي الحصول على هيكل المشروع التالي.
لكي يتم تجميع المشروع في إعداداته ، يجب عليك تحديد جميع المسارات إلى ملفات * .h ، بالإضافة إلى تسجيل التوجيه USE_STDPERIPH_DRIVER.
الآن يبقى تغيير عدة أسطر في ملف FreeRTOSConfig.h ، للعملية الصحيحة:#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
#define configCPU_CLOCK_HZ ( ( unsigned long ) 24000000 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 5 * 1024 ) )
وأضف الأسطر التالية بعد #define FREERTOS_CONFIG_H#define xPortSysTickHandler SysTick_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
بعد ذلك ، في ملف main.c ، نكتب أبسط برنامج لوميض LEDs.#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
GPIO_InitTypeDef port;
uint8_t state;
void vFreeRTOSInitAll()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_StructInit(&port);
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &port);
}
void vLedTask (void *pvParameters)
{
while(1)
{
if (state == 0)
{
GPIO_SetBits(GPIOC,GPIO_Pin_9);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
state = 1;
vTaskDelay(500);
}
else
{
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_8);
state = 0;
vTaskDelay(500);
}
}
vTaskDelete(NULL);
}
int main(void)
{
vFreeRTOSInitAll();
xTaskCreate(vLedTask,(signed char*)"LedTask", configMINIMAL_STACK_SIZE,
NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
}
الآن يمكنك تجميع المشروع وملء البرامج الثابتة في وحدة التحكم الدقيقة ، بعد إعادة التشغيل ، ومراقبة مصابيح LED الوامضة.