日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈面向对象思想下的 C 语言

發(fā)布時間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈面向对象思想下的 C 语言 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如何使用OO思維方式

面向?qū)ο?object Oriented,簡稱:OO)在于用“找對象”的方式去規(guī)劃和描述問題。

一、怎樣“找對象” (思維過程)

“對象”是具有共性的一個群體。以 L298N 控制馬達(dá)的官方推薦方法為例,控制的共性在于:每個馬達(dá)都需要 2 個 GPIO 來控制轉(zhuǎn)向,1 路 PWM 來控制轉(zhuǎn)速。不妨如下定義馬達(dá)這個群體:

馬達(dá) {2 個控制轉(zhuǎn)向的 GPIO; ?1 路控制轉(zhuǎn)速的 PWM; };??

二、怎樣“用 C 語言找對象”(思維到代碼的過程)

一個車有四個馬達(dá),每個馬達(dá)獨(dú)立控制。要完成這個控制目標(biāo),需要把“馬達(dá)”在程序里實例化,造出四個互不干涉的實例來。

1、把思維變成 C 語言的過程

說到“實例化”就想到了 C 語言里的“結(jié)構(gòu)體”,所以上面的定義變?yōu)?#xff1a;

struct 馬達(dá) {uint16_t 2個_控制轉(zhuǎn)向的 GPIO; ?uint8_t ?1路_控制轉(zhuǎn)速的 PWM; };

為了使用的時候少打點(diǎn)關(guān)鍵字、省點(diǎn)力,我們引入?typedef?關(guān)鍵字,如下:

typedef struct 馬達(dá) {uint16_t 2個_控制轉(zhuǎn)向的 GPIO; ?uint8_t ?1路_控制轉(zhuǎn)速的 PWM; } 馬達(dá);

通常把結(jié)構(gòu)體定義在頭文件里,所以:

// motor.h 頭文件內(nèi)容#ifndef __MOTOR_H__#define __MOTOR_H__ #include typedef struct stm32_motor{ ?// 2個_控制轉(zhuǎn)向的 GPIO; ?GPIO_TypeDef ? ? ?*dir_port; ?uint16_t ? ? ? ? ?pin_1; ?uint16_t ? ? ? ? ?pin_2;// 1路_控制轉(zhuǎn)速的 PWM; ?TIM_HandleTypeDef ?*tim; ?uint8_t ? ? ? ? ? ?channel;} stm32_motor;#endif /* __MOTOR_H__ */

為了易懂,Sugar 這里直接使用 CubeMX 生成的 HAL 庫 API,不加入操作系統(tǒng)。這里涉及兩個小知識點(diǎn):如何使用 GPIO 點(diǎn)亮 LED、如何使用定時器產(chǎn)生 PWM。不懂的讀者可以網(wǎng)上搜一下,大把大把的教程。

2、對象實例化

以上完成了“對象的抽象過程”,使用的就是面象對向的思維方式。直至目前相當(dāng)于計劃有了,下面就要落實。對象的實例化在 C 語言里就是:用結(jié)構(gòu)體定義變量,如下:

// motor.c 源文件內(nèi)容#include "motor.h" extern TIM_HandleTypeDef htim5; static stm32_motor motor_1 = {GPIOC, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_1, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_3, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&htim5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TIM_CHANNEL_4};static stm32_motor motor_2 = {GPIOE, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_2, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_4, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&htim5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TIM_CHANNEL_1};static stm32_motor motor_3 = {GPIOE, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_3, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&htim5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TIM_CHANNEL_2};static stm32_motor motor_4 = {GPIOC, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_0, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GPIO_PIN_2, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&htim5, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TIM_CHANNEL_3};

至此,可以看到面向?qū)ο笏枷刖褪菍δ繕?biāo)進(jìn)行歸類劃分的思想。上面把“馬達(dá)”抽象成一個有共性的群體,這樣的操作在 C 里就是“類的劃分過程”。

在 ArduPilot 開源飛控中,Libraries 庫里都是 C 的類。在了解上面所述的面向?qū)ο笏枷牒?#xff0c;可以發(fā)現(xiàn) Libraries 里那么多的代碼基本就是四種對象:
(1) 具體的硬件對象,這與本例所述的馬達(dá)類似,比如:AP_Baro、AP_GPS等;
(2) 一整套有明確功能的算法對象,比如:AC_AttitudeControl、AC_WPNav、AP_NavEKF2等;
(3) 硬件平臺對象,這里說的是:AP_HAL 及其子類;
(4) 基本數(shù)學(xué)方法對象,Sugar 在麥輪車上就移出了 ArduPilot 的 AP_Math 基本數(shù)學(xué)方法庫。

聲明:

本文于網(wǎng)絡(luò)整理,版權(quán)歸原作者所有,如來源信息有誤或侵犯權(quán)益,請聯(lián)系我們刪除或授權(quán)事宜。

總結(jié)

以上是生活随笔為你收集整理的浅谈面向对象思想下的 C 语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。