Tổ chức và nội dung các file nguồn lớp dẫn xuất (derived classes)

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu thiết kế hệ thống điều khiển tốc độ động cơ đồng bộ nam châm vĩnh cửu (Trang 74 - 83)

Chương 4 : THIẾT KẾ MẠCH IN VÀ PHẦN MỀM

4.2 Phần mềm

4.2.3 Tổ chức và nội dung các file nguồn lớp dẫn xuất (derived classes)

Để hồn thiện hình ảnh của các file nguồn lớp dẫn xuất, các mẫu của các file này được đưa ra ở đây cho một lớp dẫn xuất bắt nguồn từ class cơ sở Example.

Derived_ExampleClass.h

File này được lưu trong thư mục giao tiếp \MC, đó là một header chung chứa các giao tiếp cho lớp Derived_Example. Như đối với ExampleClass.h, một file header chứa mọi thứ cần thiết để làm việc với các lớp liên quan. File này bao gồm các method đặc trưng của lớp dẫn xuất, định nghĩa chung của kiểu lớp dẫn xuất và cấu trúc kiểu chữa các tham số hằng cần thiết để tạo đối tượng lớp dẫn xuất.

Ngoài ra và chỉ khi nào cần thì lớp này có thể chứa các định nghĩa về các kiểu nhất định cần thiết cho việc sử dụng method.

Tạo một ví dụ mới của đối tượng lớp dẫn xuất yêu cầu các con trỏ tới cả cơ sở và các cấu trúc tham số lớp dẫn xuất (xem thêm cả

Derived_ExampleClass.c).

/**

************************************************************** *****

* @file Derived_ExampleClass.h

* @author IMS Systems Lab and Technical Marketing - MC Team * @version V0.0.1

* @brief This file contains interface of Derived class

************************************************************** *****

*/

/**

* @brief Public Derived class definition */

typedef struct CDRV_EXMP_t *CDRV_EXMP; /**

* @brief Derived class parameters definition */

typedef const struct {

unsigned int param1; /*!< Example of parameter */ }DerivedParams_t, *pDerivedParams_t;

/**

* @brief Creates an object of the class Derived

* @param pExampleParams pointer to an Example parameters structure * @param pDerivedParams pointer to a Derived parameters structure * @retval CDRV_EXMP new instance of Derived object

*/

CDRV_EXMP DRV_NewObject(pExampleParams_t pExampleParams, pDerivedParams_t pDerivedParams);

/**

* @brief Example of public method of the class Derived * @param this related object of class CDRV_EXMP * @retval none

*/

void DRV_Func(CDRV_EXMP this); Derived_ExamplePrivate.h

File này được lưu trong thư mục \MC library\inc (chỉ có trong phiên bản bí mật của STM32 FOC PMSM SDK), đó là một file header lớp riêng chứa các định nghĩa riêng cần thiết cho việc thực thi lớp dẫn xuất. Nó bao gồm định nghĩa riêng của kiểu cấu trúc dữ liệu đối tượng (các biến đối tượng là các phần tử của cấu trúc này), định nghĩa lại riêng lớp tham số và định nghĩa lớp riêng.

Không giống như file header định nghĩa lớp riêng có sở liên quan, một kiểu cấu trúc lớp dẫn xuất không chứa các con trỏ tới cả các lớp dẫn xuất tiếp theo lẫn các vật chứa (containers) phương pháp ảo. Điều này hạn chế các mức độ thừa kế tới mức 1.

/**

************************************************************** *

* @file Derived_ExamplePrivate.h

* @author IMS Systems Lab and Technical Marketing - MC Team * @version V0.0.1

* @brief This file contains private definition of Derived class

************************************************************** *****

*/

/* Define to prevent recursive inclusion ------------------------*/ #ifndef __DERIVED_EXAMPLEPRIVATE_H

#define __DERIVED_EXAMPLEPRIVATE_H /**

* @brief Derived class members definition */

typedef struct {

unsigned int derived_Vars; /*!< Example of member */ }DVars_t,*pDVars_t;

/**

* @brief Redefinition of parameter structure */

typedef DerivedParams_t DParams_t, *pDParams_t; /**

* @brief Private Derived class definition */

typedef struct {

DVars_t DVars_str;/*!< Derived class members container */

pDParams_t pDParams_str;/*!< Derived class parameters container */

}_DCDRV_EXMP_t, *_DCDRV_EXMP; Derived_ExampleClass.c

File này được lưu trong thư mục \MC library\src (chỉ có trong phiên bản bí mật của STM32 FOC PMSM SDK). Đây là một file nguồn chứa các thực thi của cả các method đặc trưng lớp dẫn xuất lẫn các method ảo lớp cơ sở. Nó bao gồm cả cơ sở và giao tiếp các lớp dẫn xuất cũng như các định nghĩa riêng. Nếu các lớp dẫn xuất yêu cầu các lệnh thực thi để kích hoạt một ngắt thì sẽ tích hợp thêm file MCIRQHandlerPrivate.h.

Method DRV_NewObject thể hiện những gì đã đề cập bên trên. Nó tạo các đối tượng của lớp Derived_Example class (CDRV_EXMP) cần thiết và yêu cầu các con trỏ tới cả cấu trúc các tham số của cơ sở và các lớp dẫn xuất

đầu vào. Việc tạo đối tượng lớp dẫn xuất bao hàm cả việc tạo đối tượng lớp cơ sở liên quan. Hai đối tượng này được hợp lại bằng cách khởi tạo một con trỏ lớp cơ sở tới đối tượng lớp dẫn xuất (_oExample->DerivedClass) với địa chỉ của đối tượng lớp dẫn xuất vừa tạo (_oDerived). Các con trỏ lớp cơ sở tới các method ảo và, nếu cần, tới MC IRQ Handler cùng được khởi tạo với các con trỏ tới các hàm riêng lớp dẫn xuất. Địa chỉ của phần lớp cơ sở của đối tượng lớp dẫn xuất được thay truy xuất tới kiểu lớp dẫn xuất chung (CDRV_EXMP) và được quay trở lại.

/**

************************************************************** *

* @file Derived_ExampleClass.c

* @author IMS Systems Lab and Technical Marketing - MC Team * @version V0.0.1

* @brief This file contains private implementation of Derived class ************************************************************** ***** */ #include "ExampleClass.h" #include "ExamplePrivate.h" #include "Derived_ExampleClass.h" #include "Derived_ExamplePrivate.h" #include "MCLibraryConf.h" #include "MC_type.h"

implementation requires to be triggered by an interrupt */ #ifdef MC_CLASS_DYNAMIC

#include "stdlib.h" /* Used for dynamic allocation */ #else

_DCDRV_EXMP_t DRV_EXMPpool[MAX_DRV_EXMP_NUM]; unsigned char DRV_EXMP_Allocated = 0u;

#endif

static void DRV_VFunc(CEXMP this); /**

* @brief Creates an object of the class Derived

* @param pExampleParams pointer to an Example parameters structure * @param pDerivedParams pointer to an Derived parameters structure * @retval CDRV_EXMP new instance of Derived object

*/

CDRV_EXMP DRV_NewObject(pExampleParams_t pExampleParams, pDerivedParams_t pDerivedParams) { _CEXMP _oExample; _DCDRV_EXMP _oDerived; _oExample = (_CEXMP)EXMP_NewObject(pExampleParams); #ifdef MC_CLASS_DYNAMIC _oDerived = (_DCDRV_EXMP)calloc(1u,sizeof(_DCDRV_EXMP_t)); #else if (DRV_EXMP_Allocated < MAX_DRV_EXMP_NUM) { _oDerived = &DRV_EXMPpool[DRV_EXMP_Allocated++]; } else

{ _oDerived = MC_NULL; } #endif _oDerived->pDParams_str = pDerivedParams; _oExample->DerivedClass = (void*)_oDerived; _oExample->Methods_str.pVFunc = &DRV_VFunc; _oExample->Methods_str.pIRQ_Handler = &DRV_IRQHandler; Set_IRQ_Handler(pDerivedParams->IRQno, (_CMCIRQ)_oExample); return ((CDRV_EXMP)_oExample); } /**

* @brief Example of private method of the class Derived to implement a virtual

* function of class Example

* @param this related object of class CEXMP * @retval none

*/

static void DRV_VFunc(CEXMP this) {

((_DCDRV_EXMP)(((_CEXMP)this)->DerivedClass))- >DVars_str.derived_Vars = 0u;

} /**

* @brief Example of public method of the class Derived * @param this related object of class CDRV_EXMP * @retval none

*/

void DRV_Func(CDRV_EXMP this) {

((_DCDRV_EXMP)(((_CEXMP)this)->DerivedClass))- >DVars_str.derived_Vars = 0u;

} /**

* @brief Example of private method of the class Derived to implement an MC IRQ function

* @param this related object

* @param flag used to distinguish between various IRQ sources * @retval none

*/

static void DRV_IRQHandler(void *this, unsigned char flag) { if (flag==1u) { ((_DCDRV_EXMP)(((_CEXMP)this)->DerivedClass))- >DVars_str.derived_Vars++; } }

4.2.4 Thư viện điều khiển động cơ liên quan đến xử lý ngắt

Việc thực thi của các lớp nào đó (chẳng hạn như đo tốc độ hay dịng điện) có thể yêu cầu thực hiện các lệnh đặc biệt (được đưa ra dưới đây như là các bộ xử lý ngắt điều khiển động cơ MC IRQ Handler) khi có một sự kiện đặc biệt xảy ra dẫn đến một chương trình con xử lý ngắt (Interrupt Service Routine - ISR) liên quan.

Để giữ thư viện điều khiển động cơ và các lớp dự án người dùng riêng rẽ thì cần phải thực hiện một cơ chế cho phép kích hoạt thực thi một gói MC IRQ Handlers bên trong một lớp đã cho mà không cho phép bất kỳ một tham chiếu tường minh nào tới các đối tượng thư viện điều khiển động cơ từ lớp người dùng.

Với cơ chế như vậy, module stm32fxxx_MC_it.c (chứa các định nghĩa của tất cả các IRQ Handlers yêu cầu thi hành các lệnh MC nào đó) được tùy ý sử dụng bởi người dùng bằng cách đặt nó ở mức dự án người dùng. Cả

stm32fxxx_MC_it.c và các thư viện điều khiển động cơ đều chứa

MCIRQHandlerClass với bảng vector điều khiển động cơ (MC_IRQTable) bao gồm một tập các đối tượng cần thiết để kích hoạt một ISR. Việc lấp đầy một vị trí trong bảng được thực hiện khi một đối tượng tương ứng được khởi tạo (bên trong method XXX_New_Object liên quan) thông qua việc gọi hàm Set_IRQ_Handler. Điều này được minh họa trên hình

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu thiết kế hệ thống điều khiển tốc độ động cơ đồng bộ nam châm vĩnh cửu (Trang 74 - 83)

Tải bản đầy đủ (PDF)

(85 trang)