تثبيت FreeRTOS لـ Stm32vlDiscovery

يوم جيد.
لقد فهمت برمجة وحدات التحكم الدقيقة Stm32 ، حاولت تثبيت (نظام التشغيل في الوقت الفعلي) RTOS - FreeRTOS وواجهت عددًا من الصعوبات. هناك العديد من المقالات على الإنترنت ، لكنني لم أجد أي تعليمات واضحة ، لذلك أسأل كل شخص مهتم بالقطط.

لذا ، بالنسبة للمبتدئين ، دعنا نقرر ما تحتاجه:
  • مجلس تصحيح الأخطاء Stm32VLDiscovery
  • تثبيت IDE Keil ARM 5 وأعلى
  • الرغبة في فرز الجديد

إذا كنت قد قمت بالفعل بتطوير أي شيء لعائلة STM32F1x في Keil ، فيمكنك تخطي هذه الفقرة. تحتاج أولاً إلى تثبيت حزم تطوير لعائلة STM32F1x ، ويتم ذلك على النحو التالي:
  1. نطلق Keil.
  2. انقر على زر Pack Installer في اللوحة
  3. في النافذة التي تفتح ، انقر فوق الزر التحقق من وجود تحديثات (نحن في انتظار تحديث قائمة الحزم)
  4. في الشجرة ، حدد 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 الوامضة.

Source: https://habr.com/ru/post/ar399907/


All Articles