1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      go語言系列,go 語言

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

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

      創(chuàng)新互聯(lián)公司是一家專業(yè)的網(wǎng)站制作公司,提供的服務(wù)包括:品牌網(wǎng)站設(shè)計,網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,我們是一家專業(yè)網(wǎng)站設(shè)計公司,做網(wǎng)站,我們是認真的。我們是成都網(wǎng)站制作,成都網(wǎng)站建設(shè)的先行者,一切以客戶的利益為設(shè)計方向,能夠為不同行業(yè)的客戶提供全面、長期、深入的網(wǎng)絡(luò)解決方案。 創(chuàng)新互聯(lián)公司根據(jù)客戶的具體需求,提供從策劃、創(chuàng)意、制作、執(zhí)行等服務(wù)。

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

      我在很多的教程中都看到說樹莓派的PWM(硬件)只有一個GPIO能夠輸出,就是 GPIO1 。這可是不小的打擊,因為我想使用至少四個 PWM ,還是不死心,想通過硬件手冊上找尋蛛絲馬跡,看看究竟怎么回事。

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

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

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

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

      對照上面的表可以看出從 BCM2837 中印出來的能夠使用在PWM上的就這幾個了。

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

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

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

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

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

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

      以下是demo(pwm) 源碼

      Go語言WaitGroup使用時需要注意什么

      WaitGroup在go語言中,用于線程同步,單從字面意思理解,wait等待的意思,group組、團隊的意思,WaitGroup就是指等待一組,等待一個系列執(zhí)行完成后才會繼續(xù)向下執(zhí)行。Golang 中的 WaitGroup 一直是同步 goroutine 的推薦實踐。自己用了兩年多也沒遇到過什么問題。

      直到最近的一天同事扔過來一段奇怪的代碼:

      好了,到這里終于解決了,以上就是關(guān)于Go語言WaitGroup使用時需要注意的一些坑,希望本文中提到的這些問題對大家學(xué)習(xí)或者使用Go語言的時候能有所幫助,如果有疑問大家可以留言交流。

      Go語言之Context

      golang在1.6.2的時候還沒有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫中。中文譯作“上下文”,它主要包含了goroutine 的運行狀態(tài)、環(huán)境等信息。

      context 主要用來在 goroutine 之間傳遞上下文信息,包括:同步信號、超時時間、截止時間、請求相關(guān)值等。

      該接口定義了四個需要實現(xiàn)的方法:

      如果有個網(wǎng)絡(luò)請求Request,然后這個請求又可以開啟多個goroutine做一些事情,當這個網(wǎng)絡(luò)請求出現(xiàn)異常和超時時,這個請求結(jié)束了,這時候就可以通過context來跟蹤這些goroutine,并且通過Context來取消他們,然后系統(tǒng)才可回收所占用的資源。

      為了更方便的創(chuàng)建Context,包里頭定義了Background來作為所有Context的根,它是一個emptyCtx的實例。

      Background返回一個非空的Context。它永遠不會被取消。它通常用來初始化和測試使用,作為一個頂層的context,也就是說一般我們創(chuàng)建的context都是基于Background。

      TODO返回一個非空的Context。當不清楚要使用哪個上下文的時候可以使用TODO。

      他們兩個本質(zhì)上都是emptyCtx結(jié)構(gòu)體類型,是一個不可取消,沒有設(shè)置截止時間,沒有攜帶任何值的Context。

      有了如上的根Context,那么是如何衍生更多的子Context的呢?這就要靠context包為我們提供的With系列的函數(shù)了。

      通過這些函數(shù),就創(chuàng)建了一顆Context樹,樹的每個節(jié)點都可以有任意多個子節(jié)點,節(jié)點層級可以有任意多個。

      WithCancel函數(shù),最常用的派生 context 方法。該方法接受一個父 context。父 context 可以是一個 background context 或其他 context。

      WithDeadline函數(shù),該方法會創(chuàng)建一個帶有 deadline 的 context。當 deadline 到期后,該 context 以及該 context 的可能子 context 會受到 cancel 通知。另外,如果 deadline 前調(diào)用 cancelFunc 則會提前發(fā)送取消通知。

      WithTimeout和WithDeadline基本上一樣,這個表示是超時自動取消,是多少時間后自動取消Context的意思。

      WithValue函數(shù)和取消Context無關(guān),它是為了生成一個綁定了一個鍵值對數(shù)據(jù)的Context,這個綁定的數(shù)據(jù)可以通過Context.Value方法訪問到,一般我們想要通過上下文來傳遞數(shù)據(jù)時,可以通過這個方法,如我們需要tarce追蹤系統(tǒng)調(diào)用棧的時候。

      使用Context的程序應(yīng)遵循以下規(guī)則,以使各個包之間的接口保持一致:

      1.不要將 Context 塞到結(jié)構(gòu)體里。直接將 Context 類型作為函數(shù)的第一參數(shù),而且一般都命名為 ctx。

      2.不要向函數(shù)傳入一個 nil 的 context,如果你實在不知道傳什么,標準庫給你準備好了一個 context:todo。

      3.不要把本應(yīng)該作為函數(shù)參數(shù)的類型塞到 context 中,context 存儲的應(yīng)該是一些共同的數(shù)據(jù)。例如:登陸的 session、cookie 等。

      4.同一個 context 可能會被傳遞到多個 goroutine,別擔(dān)心,context 是并發(fā)安全的。

      GO語言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用

      GO是編譯性語言,所以函數(shù)的順序是無關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫在最前面,其余函數(shù)按照功能需要進行排列

      GO的函數(shù) 不支持嵌套,重載和默認參數(shù)

      GO的函數(shù) 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等

      GO的函數(shù)用 func 來聲明,且左大括號 { 不能另起一行

      一個簡單的示例:

      輸出為:

      參數(shù):可以傳0個或多個值來供自己用

      返回:通過用 return 來進行返回

      輸出為:

      上面就是一個典型的多參數(shù)傳遞與多返回值

      對例子的說明:

      按值傳遞:是對某個變量進行復(fù)制,不能更改原變量的值

      引用傳遞:相當于按指針傳遞,可以同時改變原來的值,并且消耗的內(nèi)存會更少,只有4或8個字節(jié)的消耗

      在上例中,返回值 (d int, e int, f int) { 是進行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:

      當返回了多個值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來補位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉

      在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數(shù)

      輸出為:

      在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數(shù)的例子,更多一些演變的形式,都非常類似

      在GO中 defer 關(guān)鍵字非常重要,相當于面相對像中的析構(gòu)函數(shù),也就是在某個函數(shù)執(zhí)行完成后,GO會自動這個;

      如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進后出;

      當某個函數(shù)出現(xiàn)嚴重錯誤時, defer 也會被調(diào)用

      輸出為

      這是一個最簡單的測試了,當然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時,判斷是哪個函數(shù)出了問題,完全可以根據(jù) defer 打印出來的內(nèi)容來進行判斷,非常快速,這種留給你們?nèi)崿F(xiàn)

      一個函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱之為遞歸函數(shù),在做遞歸調(diào)用時,經(jīng)常會將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用

      本篇重點介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct

      Go語言有什么好用的IDE嗎

      我喜歡jetbrains系列的IDE+go插件。不過我要說的是這個問題主要看你的觀點如何。

      說eclipse:

      構(gòu)建方式是使用go

      install

      命令,每一次編譯運行都是go

      install。這樣的好處就是如果你有很多的包,下載下來并沒有編譯,這樣每次編譯速度是很快的。而且(!)go

      install

      符合go官方的項目結(jié)構(gòu),官方說過了,一個go的項目應(yīng)該是以個gopath,包含src,pkg,bin三個主要目錄。所以說go

      install個人認為才是主要的go編譯方式。

      說eclipse的缺點:

      其實eclipse插件的go編譯方式,還有目錄結(jié)構(gòu),項目結(jié)構(gòu),都是非常完美的!!!!真的很完美!可是,他的代碼提示,太差件!大括號都不能自動補全,gdb

      32bit

      64bit兼容問題,eclipseC++

      沒有html

      js插件,需要手動安裝,幾乎不能開箱即用。不過如果你是開發(fā)算法,數(shù)據(jù)處理,還是推薦eclipse的,畢竟其他都無關(guān)緊要。

      說jetbrains:

      說先說clione肯定不適合,新建項目沒有向?qū)В瑢?dǎo)致改成go項目各種不開心,比如圖標對于我來說就無法接受go

      lib

      不是小耗子~這是次要的,重要的是各個文件都是灰色的(沒有在cmake中包含的結(jié)果),然后說剩下的,phpstorm這個不說了,估計很少有人插件按在這里,webstorm,體驗也不是很好,idea?體驗很好,可是畢竟比較重,尤其是現(xiàn)在加入了自家的K啥玩意(無意冒犯,沒記住單詞)~可是話說回來,go跟C系列IDE配合才是最佳,跟java系列一點不搭關(guān)系,用idea似乎有點格格不入,但是!idea支持新建項目向?qū)В琹ib的圖標也很清晰,最后還是選擇idea吧,期待clion的強大起來!

      再說jetbrains系列缺點:

      插件的構(gòu)建方式是go

      buiild

      這個讓人很不爽,我們幾乎不確定會構(gòu)建到什么地方去,還要每次設(shè)置一下run配置。這個可能無關(guān)緊要,畢竟不是什么大的毛病,可是go

      build不能緩存.a文件,直接構(gòu)建的結(jié)果就是很多第三方包的情況下很慢!所以建議安裝包的時候手動install

      一下解決這個問題。自帶代碼格式化,這個格式化跟go

      格格不入,總的來說就是蛋疼,心碎,菊花癢。

      最后說liteIDE:

      輕量級IDE,我可以說是國人GO偉大作品典范,然而默認構(gòu)建也是go

      build,項目管理方式不符合go官方標準。代碼提示不能自動導(dǎo)入(eclipse也不能),不過如果你的項目是以包為單位的,那么另當別論。一定很不錯,畢竟是輕量級專門針對GO的IDE!

      說這些,其實還有很大一部分取決于你的項目是用vendor機制管理,還是godeps機制管理依賴關(guān)系。go不像java擁有強大的幾乎天下一統(tǒng)的maven(無意冒犯,暫不評價其他構(gòu)建套件)。

      go沒有官方包倉庫。

      go沒有官方包管理工具。

      go沒有官方自動化構(gòu)建套件。

      上面三個沒有是致命要害。導(dǎo)致民間各種百花齊放。

      說說我的項目怎么管理

      gpm

      一個shell工具(windows下你可以用git的bash,或者cygwin~)

      我是嚴格艷照官方推薦方式管理go項目,一個go項目一個gopath。系統(tǒng)的gopath只是為了安裝go命令,我沒有配置gobin,意義不大。

      項目的依賴跟我的代碼包都在src下(非vendor)

      vendor用來存放包的特殊依賴,發(fā)布項目直接把依賴包發(fā)布上去(公網(wǎng)管理則只上傳依賴關(guān)系文件

      godeps文件)

      資源文件等都放在src目錄同級,編譯文件放在bin,引用直接../引用。

      GO語言(十三):使用 Go 和 Gin 開發(fā) RESTful API(下)

      當客戶端在 發(fā)出POST請求時/albums,您希望將請求正文中描述的專輯添加到現(xiàn)有專輯數(shù)據(jù)中。

      為此,您將編寫以下內(nèi)容:

      1、編寫代碼

      a.添加代碼以將專輯數(shù)據(jù)添加到專輯列表。

      在此代碼中:

      1)用于Context.BindJSON 將請求正文綁定到newAlbum。

      2) album將從 JSON 初始化的結(jié)構(gòu)附加到albums 切片。

      3)向響應(yīng)添加201狀態(tài)代碼,以及表示您添加的專輯的 JSON。

      b.更改您的main函數(shù),使其包含該router.POST函數(shù),如下所示。

      在此代碼中:

      1)將路徑中的POST方法與 /albumspostAlbums函數(shù)相關(guān)聯(lián)。

      使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關(guān)聯(lián)。這樣,您可以根據(jù)客戶端使用的方法將發(fā)送到單個路徑的請求單獨路由。

      a.如果服務(wù)器從上一節(jié)開始仍在運行,請停止它。

      b.從包含 main.go 的目錄中的命令行,運行代碼。

      c.從不同的命令行窗口,用于curl向正在運行的 Web 服務(wù)發(fā)出請求。

      該命令應(yīng)顯示添加專輯的標題和 JSON。

      d.與上一節(jié)一樣,使用curl檢索完整的專輯列表,您可以使用它來確認添加了新專輯。

      該命令應(yīng)顯示專輯列表。

      當客戶端向 發(fā)出請求時GET /albums/[id],您希望返回 ID 與id路徑參數(shù)匹配的專輯。

      為此,您將:

      a.在您在上一節(jié)中添加的函數(shù)下方postAlbums,粘貼以下代碼以檢索特定專輯。

      此getAlbumByID函數(shù)將提取請求路徑中的 ID,然后找到匹配的專輯。

      在此代碼中:

      (1)Context.Param用于從 URL 中檢索id路徑參數(shù)。當您將此處理程序映射到路徑時,您將在路徑中包含參數(shù)的占位符。

      (2)循環(huán)album切片中的結(jié)構(gòu),尋找其ID 字段值與id參數(shù)值匹配的結(jié)構(gòu)。如果找到,則將該album結(jié)構(gòu)序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應(yīng)返回。

      如上所述,實際使用中的服務(wù)可能會使用數(shù)據(jù)庫查詢來執(zhí)行此查找。

      (3)如果找不到專輯,則返回 HTTP 404錯誤。

      b.最后,更改您的main,使其包含對router.GET的新調(diào)用,路徑現(xiàn)在為/albums/:id ,如以下示例所示。

      在此代碼中:

      (1)將/albums/:id路徑與getAlbumByID功能相關(guān)聯(lián)。在 Gin 中,路徑中項目前面的冒號表示該項目是路徑參數(shù)。

      a.如果服務(wù)器從上一節(jié)開始仍在運行,請停止它。

      b.在包含 main.go 的目錄中的命令行中,運行代碼以啟動服務(wù)器。

      c.從不同的命令行窗口,用于curl向正在運行的 Web 服務(wù)發(fā)出請求。

      該命令應(yīng)顯示您使用其 ID 的專輯的 JSON。如果找不到專輯,您將收到帶有錯誤消息的 JSON。

      恭喜!您剛剛使用 Go 和 Gin 編寫了一個簡單的 RESTful Web 服務(wù)。

      本節(jié)包含您使用本教程構(gòu)建的應(yīng)用程序的代碼。


      當前題目:go語言系列,go 語言
      文章URL:http://www.ef60e0e.cn/article/dsejhgi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        澎湖县| 德州市| 育儿| 锦屏县| 西平县| 隆回县| 汉沽区| 新绛县| 和林格尔县| 德安县| 荆州市| 伊川县| 日土县| 蚌埠市| 湄潭县| 军事| 丁青县| 南岸区| 泸溪县| 阿克苏市| 台中市| 嘉祥县| 鸡泽县| 沾益县| 威宁| 通榆县| 闽清县| 蓬莱市| 厦门市| SHOW| 新田县| 图木舒克市| 新巴尔虎左旗| 论坛| 庄河市| 绥江县| 北川| 孙吴县| 武汉市| 西充县| 翁源县|