go語(yǔ)言寫(xiě)硬件 go語(yǔ)言程序

為什么不用Go語(yǔ)言寫(xiě)單片機(jī)程序

單片機(jī)不像一些應(yīng)用軟件,和硬件結(jié)合十分緊密,必須要求“高效”,所以匯編語(yǔ)言是最好選擇,其次就是C語(yǔ)言了。其他語(yǔ)言編譯效率都太低,滿(mǎn)足不了要求。

創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)10多年來(lái)致力于為客戶(hù)提供網(wǎng)站制作、成都網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了數(shù)千家網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。

【原創(chuàng)】樹(shù)莓派3B開(kāi)發(fā)Go語(yǔ)言(四)-自寫(xiě)庫(kù)實(shí)現(xiàn)pwm輸出

在前一小節(jié)中介紹了點(diǎn)亮第一個(gè)LED燈,這里我們準(zhǔn)備進(jìn)階嘗試下,輸出第一段PWM波形。(PWM也就是脈寬調(diào)制,一種可調(diào)占空比的技術(shù),得到的效果就是:如果用示波器測(cè)量引腳會(huì)發(fā)現(xiàn)有方波輸出,而且高電平、低電平的時(shí)間是可調(diào)的。)

這里爪爪熊準(zhǔn)備寫(xiě)成一個(gè)golang的庫(kù),并開(kāi)源到github上,后續(xù)更新將直接更新到github中,如果你有興趣可以和我聯(lián)系。 github.com/dpawsbear/bear_rpi_go

我在很多的教程中都看到說(shuō)樹(shù)莓派的PWM(硬件)只有一個(gè)GPIO能夠輸出,就是 GPIO1 。這可是不小的打擊,因?yàn)槲蚁胧褂弥辽偎膫€(gè) PWM ,還是不死心,想通過(guò)硬件手冊(cè)上找尋蛛絲馬跡,看看究竟怎么回事。

手冊(cè)上找尋東西稍等下講述,這里先提供一種方法測(cè)試 樹(shù)莓派3B 的 PWM 方法:用指令控制硬件PWM。

這里通過(guò)指令的方式掌握了基本的pwm設(shè)置技巧,決定去翻一下手冊(cè)看看到底PWM怎么回事,這里因?yàn)闆](méi)有 BCM2837 的手冊(cè),根據(jù)之前文章引用官網(wǎng)所說(shuō), BCM2835 和 BCM2837 應(yīng)該是一樣的。這里我們直接翻閱 BCM2835 的手冊(cè),直接找到 PWM 章節(jié)。找到了如下圖:

圖中可以看到在博通的命名規(guī)則中 GPIO 12、13、18、19、40、41、45、52、53 均可以作為PWM輸出。但是只有兩路PWM0 PWM1。根據(jù)我之前所學(xué)知識(shí),不出意外應(yīng)該是PWM0 和 PWM1可以輸出不一樣的占空比,但是頻率應(yīng)該是一樣的。因?yàn)闆](méi)有示波器,暫時(shí)不好測(cè)試。先找到下面對(duì)應(yīng)圖:

根據(jù)以上兩個(gè)圖對(duì)比可以發(fā)現(xiàn)如下規(guī)律:

對(duì)照上面的表可以看出從 BCM2837 中印出來(lái)的能夠使用在PWM上的就這幾個(gè)了。

為了驗(yàn)證個(gè)人猜想是否正確,這里先直接使用指令的模式,模擬配置下是否能夠正常輸出。

通過(guò)上面一系列指令模擬發(fā)現(xiàn),(GPIO1、GPIO26)、(GPIO23、GPIO24)是綁定在一起的,調(diào)節(jié)任意一個(gè),另外一個(gè)也會(huì)發(fā)生變化。也即是PWM0、PWM1雖然輸出了兩路,可以理解成兩路其實(shí)都是連在一個(gè)輸出口上。這里由于沒(méi)有示波器或者邏輯分析儀這類(lèi)設(shè)備(僅有一個(gè)LED燈),所以測(cè)試很簡(jiǎn)陋,下一步是使用示波器這類(lèi)東西對(duì)頻率以及信號(hào)穩(wěn)定性進(jìn)行下測(cè)試。

小節(jié):樹(shù)莓派具有四路硬件輸出PWM能力,但是四路中只能輸出兩個(gè)獨(dú)立(占空比獨(dú)立)的PWM,同時(shí)四路輸出的頻率均是恒定的。

上面大概了解清楚了樹(shù)莓派3B的PWM結(jié)構(gòu),接下來(lái)就是探究如何使用Go語(yǔ)言進(jìn)行設(shè)置。

因?yàn)槟玫搅耸謨?cè),這里我想直接操作寄存器的方式進(jìn)行設(shè)置,也是順便學(xué)習(xí)下Go語(yǔ)言處理寄存器的過(guò)程。首先需要拿到pwm 系列寄存器的基地址,但是翻了一圈手冊(cè),發(fā)現(xiàn)只有偏移,沒(méi)有找到基地址。

經(jīng)過(guò)了一段時(shí)間的努力后,決定寫(xiě)一個(gè) 樹(shù)莓派3B golang包開(kāi)源放在github上,只需要寫(xiě)相關(guān)程序進(jìn)行調(diào)用就可以了,以下是相關(guān)demo(pwm)(在GPIO.12 上輸出PWM波,放上LED燈會(huì)有呼吸燈的效果,具體多少頻率還沒(méi)有進(jìn)行測(cè)試)

以下是demo(pwm) 源碼

使用Go 語(yǔ)言開(kāi)發(fā)大型 MMORPG 游戲服務(wù)器怎么樣

1.為什么golang的開(kāi)發(fā)效率高?

golang是一編譯型的強(qiáng)類(lèi)型語(yǔ)言,它在開(kāi)發(fā)上的高效率主要來(lái)自于后發(fā)優(yōu)勢(shì),不用考慮舊有惡心的歷史,又有一個(gè)較高的工程視角。良好的避免了程序員因?yàn)椤?{ 需不需要獨(dú)占一行 ”這種革命問(wèn)題打架,也解決了一部分趁編譯時(shí)間找產(chǎn)品妹妹搭訕的階級(jí)敵人。

它有自己的包管理機(jī)制,工具鏈成熟,從開(kāi)發(fā)、調(diào)試到發(fā)布都很簡(jiǎn)單方便;

有反向接口、defer、coroutine等大量的syntactic sugar;

編譯速度快,因?yàn)槭菑?qiáng)類(lèi)型語(yǔ)言又有g(shù)c,只要通過(guò)編譯,非業(yè)務(wù)毛病就很少了;

它在語(yǔ)法級(jí)別上支持了goroutine,這是大家說(shuō)到最多的內(nèi)容,這里重點(diǎn)提一下。首先,coroutine并不稀罕,語(yǔ)言并不能超越硬件、操作系統(tǒng)實(shí)現(xiàn)神乎其神的功能。golang可以做到事情,其他語(yǔ)言也可以做到,譬如c++,在boost庫(kù)里面自己就有的coroutine實(shí)現(xiàn)(當(dāng)然用起來(lái)跟其他boost庫(kù)一樣惡心)。golang做的事情,是把這一套東西的使用過(guò)程簡(jiǎn)化了,并且提供了一套channel的通信模式,使得程序員可以忽略諸如死鎖等問(wèn)題。

goroutine的目的是描述并發(fā)編程模型。并發(fā)與并行不同,它并不需要多核的硬件支持,它不是一種物理運(yùn)行狀態(tài),而是一種程序邏輯流程。它的主要目的不是利用多核提高運(yùn)行效率,而是提供一種更容易理解、不容易出錯(cuò)的語(yǔ)言來(lái)描述問(wèn)題。

實(shí)際上golang默認(rèn)就是運(yùn)行在單OS進(jìn)程上面的,通過(guò)指定環(huán)境變量GOMAXPROCS才能轉(zhuǎn)身跑在多OS進(jìn)程上面。有人提到了網(wǎng)易的pomelo,開(kāi)源本來(lái)是一件很不錯(cuò)的事情,但是基于自己對(duì)callback hell的偏見(jiàn),我一直持有這種態(tài)度:敢用nodejs寫(xiě)大規(guī)模游戲服務(wù)器的人,都是真正的勇士 : ) 。

2、Erlang與Golang的coroutine有啥區(qū)別,coroutine是啥?

coroutine本質(zhì)上是語(yǔ)言開(kāi)發(fā)者自己實(shí)現(xiàn)的、處于user space內(nèi)的線(xiàn)程,無(wú)論是erlang、還是golang都是這樣。需要解決沒(méi)有時(shí)鐘中斷;碰著阻塞式i\o,整個(gè)進(jìn)程都會(huì)被操作系統(tǒng)主動(dòng)掛起;需要自己擁有調(diào)度控制能力(放在并行環(huán)境下面還是挺麻煩的一件事)等等問(wèn)題。那為啥要廢老大的勁自己做一套線(xiàn)程放user space里面呢?

并發(fā)是服務(wù)器語(yǔ)言必須要解決的問(wèn)題;

system space的進(jìn)程還有線(xiàn)程調(diào)度都太慢了、占用的空間也太大了。

把線(xiàn)程放到user space的可以避免了陷入system call進(jìn)行上下文切換以及高速緩沖更新,線(xiàn)程本身以及切換等操作可以做得非常的輕量。這也就是golang這類(lèi)語(yǔ)言反復(fù)提及的超高并發(fā)能力,分分鐘給你開(kāi)上幾千個(gè)線(xiàn)程不費(fèi)力。

不同的是,golang的并發(fā)調(diào)度在i/o等易發(fā)阻塞的時(shí)候才會(huì)發(fā)生,一般是內(nèi)封在庫(kù)函數(shù)內(nèi);erlang則更夸張,對(duì)每個(gè)coroutine維持一個(gè)計(jì)數(shù)器,常用語(yǔ)句都會(huì)導(dǎo)致這個(gè)計(jì)數(shù)器進(jìn)行reduction,一旦到點(diǎn),立即切換調(diào)度函數(shù)。

中斷介入程度的不同,導(dǎo)致erlang看上去擁有了preemptive scheduling的能力,而golang則是cooperative shceduling的。golang一旦寫(xiě)出純計(jì)算死循環(huán),進(jìn)程內(nèi)所有會(huì)話(huà)必死無(wú)疑;要有大計(jì)算量少i\o的函數(shù)還得自己主動(dòng)叫runtime.Sched()來(lái)進(jìn)行調(diào)度切換。

3、golang的運(yùn)行效率怎么樣?

我是相當(dāng)反感所謂的ping\pong式benchmark,運(yùn)行效率需要放到具體的工作環(huán)境下面考慮。

首先,它再快也是快不過(guò)c的,畢竟底下做了那么多工作,又有調(diào)度,又有g(shù)c什么的。那為什么在那些benchmark里面,golang、nodejs、erlang的響應(yīng)效率看上去那么優(yōu)秀呢,響應(yīng)快,并發(fā)強(qiáng)?并發(fā)能力強(qiáng)的原因上面已經(jīng)提到了,響應(yīng)快是因?yàn)榇罅糠亲枞絠\o操作出現(xiàn)的原因。這一點(diǎn)c也可以做到,并且能力更強(qiáng),但是得多寫(xiě)不少優(yōu)質(zhì)代碼。

然后,針對(duì)游戲服務(wù)器這種高實(shí)時(shí)性的運(yùn)行環(huán)境,GC所造成的跳幀問(wèn)題確實(shí)比較麻煩,前面的大神 @達(dá)達(dá) 有比較詳細(xì)的論述和緩解方案,就不累述了 。隨著golang的持續(xù)開(kāi)發(fā),相信應(yīng)該會(huì)有非常大的改進(jìn)。一是屏蔽內(nèi)存操作是現(xiàn)代語(yǔ)言的大勢(shì)所趨,它肯定是需要被實(shí)現(xiàn)的;二是GC算法已經(jīng)相當(dāng)?shù)某墒?,效率勉勉?qiáng)強(qiáng)過(guò)得去;三是可以通過(guò)incremental的操作來(lái)均攤cpu消耗。

用這一點(diǎn)點(diǎn)效率損失換取一個(gè)更高的生產(chǎn)能力是不是值得呢?我覺(jué)得是值得的,硬件已經(jīng)很便宜了,人生苦短,讓自己的生活更輕松一點(diǎn)吧: )。

4、基于以上的論述,我認(rèn)為采用go進(jìn)行小范圍的MMORPG開(kāi)發(fā)是可行的。

分享文章:go語(yǔ)言寫(xiě)硬件 go語(yǔ)言程序
當(dāng)前路徑:http://muchs.cn/article12/doeocgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、Google、電子商務(wù)、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站改版、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)