微服務中的網關

什麼是網關

  簡單點說網關是一個Api服務器,是系統的唯一入口。為每個客戶端提供一個定製的Restful API。同時它還需要具有一些業務之外的責任:鑒權。靜態響應等處理。

為什麼需要gateway

  我們知道我們要進入一個服務本身,並不是一件容易的事情。服務本身有自己的通訊協議,這種協議往往不能很好的兼容各個客戶端的需求,所以我們只能尋找一種公共協議:http。所以網關的概念就誕生了。如圖:

  

gateway的作用

  所以網關的最主要在作用就是路由的轉發 。但是 在我們平時的使用過程中,直接請求http 協議的 api 會存在很多問題。例如:安全問題,流量問題  等等。所以gateway 還需要做一些額外的 事情來保證我們的流程是安全的、可靠的。

使用網關

  現在已經出現了很多網關的產品:比如 Ocelot ,zuul ,Spring Cloud Gateway,kong 等等

  今天我們要 介紹的網關就是  kong

kong 在docker中的部署

創建一個kong的網絡

  docker network create kong-net

創建數據庫 pgsql  

docker run -d --name kong-database --network=kong-net  -p 5432:5432  -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong"  -e "POSTGRES_PASSWORD=qwe123QWE"  postgres:9.6

 數據遷移  

docker run --rm \
      --network=kong-net \
      -e "KONG_DATABASE=postgres" \
      -e "KONG_PG_HOST=kong-database" \
      -e "KONG_PG_PASSWORD=qwe123QWE" \
      -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
      kong:latest kong migrations bootstrap

啟動kong  

docker run -d --name kong \
   --network=kong-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_PASSWORD=qwe123QWE" \
  -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
  -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
  -p 8000:8000 \
  -p 8443:8443 \
  -p 8001:8001 \
  -p 8444:8444 \
  kong

瀏覽器輸入:http:kongip:8001,會出現json字符,表示成功

安裝konga

數據遷移

docker run --network=kong-net --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://kong:qwe123QWE@kong-database:5432/konga

啟動konga

docker run 
-p 1337:1337 \
--network kong-net \
--name konga \
-e "NODE_ENV=production" \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgresql://kong:qwe123QWE@kong-database:5432/konga" \
pantsel/konga

創建鏈接的Admin URL地址可以使用kong創建的網絡。例如:http://kong:8001

 如圖:

 然後可以自行編輯自己的 serevices 與service對應的route  訪問:http:kongip:8000/路由  就可以訪問你的  api啦

最後安利一波

ketchup 是一個微服務框架  它集成了網關kong,通過簡單的配置,可以自行註冊到kong的網關中,大大減少了開發的時間。

源碼地址:https://github.com/simple-gr/ketchup

操作文檔  請見:https://github.com/simple-gr/ketchup/wiki/%E7%BD%91%E5%85%B3。

qq 交流群:592407137

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

用路虎給公司女同事一個聖誕驚喜

主角到場,似乎激動得說不出話了,這是要求婚的節奏。顏值擔當:小喬Jacky深情演唱。攝影師:費玉清-如果我是DJ。後期剪輯:子詠運營:苦瓜。帥X主持人:張濤靈魂字幕君:KAM知道你們嫉妒我的顏。我就靜靜的看你們裝逼。祝大家聖誕快樂。

眼看幾年即將結束,為了給公司勞苦功高的女同事一個浪漫的聖誕之夜,TV的小夥伴們精心策劃了一個聖誕party。

有夢想的男人:大宇宙哥

7200干他:Jacky

滿滿一車東西,滿滿的都是驚喜,出發!

我曾經跨過高山大海,現在就經常買買菜。

包裝師:雞爺

悉心裝飾現場。

恩,小喬會不會感動就靠你了。

就等夜晚降臨。

主角到場,似乎激動得說不出話了,這是要求婚的節奏?

顏值擔當:小喬

Jacky深情演唱。

攝影師:費玉清-如果我是DJ。

後期剪輯:子詠

運營:苦瓜。

帥X主持人:張濤

靈魂字幕君:KAM

知道你們嫉妒我的顏。

我就靜靜的看你們裝逼。

祝大家聖誕快樂!

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

不得不服!這台全能SUV居然能甩對手一條街

同時,奧迪Q7後排座椅支持前後移動,以身高178cm的體驗者,調節至最後面的後排實測腿部空間可超過2拳,即便調節最前面的腿部空間仍達1拳有餘。奧迪Q7的後備箱空間也不失所望,高達890L容積滿足一切對空間的想象。兼顧科技實用 配置領先同級在配置上,為了更好地體現兩者的差異性,我們不妨拿奧迪Q7和寶馬X5各自的頂配車型對比,從兩車的表格可以明顯看出,奧迪Q7擁有寶馬X5所不具備的感應後備箱,12。

在整個汽車大環境不太景氣的背景下,唯獨SUV銷量始終保持了逆市上揚的態勢,SUV市場份額從2012年的15%,一路攀升到今年的39%,由此可見,國人是有多喜歡SUV的高視野、高底盤以及大空間。然而,隨着消費需求的不斷升級,SUV同質化情況的加劇,用戶已經不滿足於SUV基礎單一的功能性,更需要兼具豪華感、科技感、駕駛性能等高端產品元素。

這也是為何豪華中大型SUV市場能受到極高的用戶關注度,而在這個級別中,最引人矚目想必是寶馬X5,奧迪Q7這兩款標杆之作。眾所周知,寶馬X5號稱是最強公路SUV,那麼奧迪Q7呢?事實上,奧迪Q7不僅是一款全路況SUV,同時還是一款能越野的SUV。因此,比較這兩台車就多了一番趣味性和參考價值。話不多說,還是趕緊看看寶馬X5和奧迪Q7,誰會更符合消費者的審美眼光呢?

外觀各具特色 奧迪Q7更顯豪華

寶馬X5的外觀風格強調力量感,雙腎前臉和天使眼是我們所熟知的寶馬家族化設計標誌,採用大量犀利有力量感的線條來突顯整車的運動感。而奧迪Q7作為奧迪旗下的旗艦車型,外觀方面自然也不敢馬虎,六邊形大嘴,搭配炫酷的LED 矩陣式大燈,兼具時尚和科技感,造型設計趨向於年輕動感。總的來說,同為德系的兩款豪華SUV都有很高的顏值,但寶馬X5更強調其運動身份,設計風格偏向於張揚高調。而奧迪Q7看上去更顯尊貴豪華,氣宇軒昂。

尺寸方面,長寬高達到5086/1968/1716mm,軸距3001mm,但相比寶馬X5,奧迪Q7在長度和軸距上更具優勢。此外,奧迪Q7還是同級別長度和軸距的領先者,舒適、寬敞不在話下。

內飾風格迥異 奧迪Q7科技完勝

兩車內飾的豪華感和品質感都營造得很出色,做工用料均無可挑剔。寶馬X5這套內飾設計相信大家已經非常熟悉,層次感分明,懸浮式中控大屏配合大量的實體按鍵,延續了寶馬以往的設計理念,但看久之後難免會有些審美疲勞。反觀之下,奧迪Q7的內飾則帶來一種新鮮感,煥然一新的內飾設計,瞬間燃爆用戶最敏銳的視覺神經,最大的驚喜莫過於這塊12.3英寸的全液晶儀錶盤,科技感爆棚,無論操作還是反饋的人性化程度都非常高,着實是令人愛不惜手。

正如上面所提到的,奧迪Q7的長度和軸距都要比寶馬X5優秀,實際表現也確實如此。同時,奧迪Q7後排座椅支持前後移動,以身高178cm的體驗者,調節至最後面的後排實測腿部空間可超過2拳,即便調節最前面的腿部空間仍達1拳有餘。奧迪Q7的後備箱空間也不失所望,高達890L容積滿足一切對空間的想象。

兼顧科技實用 配置領先同級

在配置上,為了更好地體現兩者的差異性,我們不妨拿奧迪Q7和寶馬X5各自的頂配車型對比,從兩車的表格可以明顯看出,奧迪Q7擁有寶馬X5所不具備的感應後備箱,12.3英寸全液晶儀錶盤,自動泊車,LED矩陣式大燈等科技配置。 尤其是在操控輔助方面,奧迪Q7旗艦車型所配備的quattro全時四驅系統、後輪主動轉向系統(選裝),同時全車減重300KG,足以提供奧迪Q7良好的操控性,賦予了奧迪Q7全路況駕駛性能。

更強勁的動力 更經濟的油耗

動力系統方面,兩車的銷量主力均為2.0T車型,寶馬X5和奧迪Q7都採用了2.0T發動機和8速手自一體變速箱的動力總成,寶馬X5的最大功率為180Kw,最大扭矩為350Nm,而奧迪Q7的最大功率為185Kw,最大扭矩為370Nm。從兩車的技術參數可見,奧迪Q7相對寶馬X5略勝一籌。而且,在燃油經濟性上,奧迪Q7 8.5L的官方百公里油耗數據,也確實比寶馬X5更有話語權。

如此全能的奧迪Q7會是你明年的目標?

說完了一大段后,誰更適合你,答案不正明擺着嗎?相比寶馬X5,奧迪Q7在許多方面都擁有過硬的實力,隨便一個產品點就能讓你為之傾心。氣場十足的高顏值外觀、由內到外的科技感和品質感,哦!別忘了,還有奧迪Q7最引以為傲的動力性和操控性。當然,或許你還在為操控還是舒適,實用還是逼格而煩惱,那麼綜合來看,除了全能均衡的奧迪Q7,還能有誰?嗯嗯,看到這之後,已經猜到你為明年購車計劃定好目標了。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

聖誕節只有土豪能裝逼?最後眾泰又笑了…

此次就調侃到這裏最後祝大家聖誕節快樂。不說了,要去找小喬了。

以上這三款車都非常值得推薦!

此次就調侃到這裏

最後祝大家聖誕節快樂!

不說了,要去找小喬了!

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

就算你年薪二十萬,教授也只推薦買這些十多萬的車

對不起,真正為玩車的人是玩手動擋的不喜歡日系車。那高爾夫R-Line也是能讓你爽翻的車重只有1。3噸的R-Line卻有着150ps的馬力搭配換擋奇快的7速雙離合秒殺BBA不是夢當然,也有人買車不是為了玩對於顧家好男人來說空間太小,就算車子會飛也沒有用那這個時候,擁有寬裕後排的B級車就是你的首選什麼。

老K是的一位朋友

他是某保險公司的高級銷售

相當的敬業

所謂一分耕耘一分收穫

兢兢業業的老K現在已經是年薪二十萬的有錢淫

收入比叫獸高好幾個檔次呢

有錢了,逼格肯定要跟上

老K立馬去4S給提了一輛BBA

然而

讓老K意想不到的是

養一輛豪車比他想象的吃力

油耗和保險已經夠厲害了

維修保養就更別說

進去一次4S店

坑你個三五千都是洒洒碎

所以老K很後悔當初沒有聽叫獸的話

買一輛十來萬的車

然而這已經太遲了

為了避免大家重走老K的路

叫獸有必要說說

哪怕你年薪二十萬,買一輛十來萬的車就夠了

十來萬的車子其實也可以很有逼格

雖然太愛面子不是好事

但是一個人開什麼車子的確體現了他的品味

就像老K的BBA,起碼在外人看來不是垃圾

然而你真要高逼格的話,十來萬的車確實也有

記得第一次看見博瑞實車的時候

還以為是哪個品牌的新款進口車

走進一看才發現這是大名鼎鼎的博瑞

連都會產生這種錯覺

那對於不太懂車的人來說

博瑞的逼格就不言而喻了

那假如想要強勁的動力呢?

思域神車就能給到本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

※網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

合資SUV都被國產車逼的跌破10萬了…現在是入手的好時機!

為了打破這種障礙,KX3改款之後變得圓潤了很多。作為改款車型,KX3的外觀造型變化不大。主要把前臉LED日間行車燈的位置往下移了之後,變得更加的協調可愛。圓潤的前臉配合大嘴的設計,很具特色。飽滿的車身線條流暢自然。

合資小型SUV雖然價格相對於自主SUV車型而言,總體的價格真的高了不少。雖則價格高那麼多,但總每一個月的銷量來看合資小型SUV確是不低。歸根到底既是合資SUV的顏值很高,而且它質量相對更加可靠也是很多消費者看重的地方。但消費者買車肯定想着能省一分是一分的,最近看到目前很火的幾款小型SUV市場上的終端優惠不低,不知道你看到之後有沒有想買車的想法呢?

大家都能看到,這幾款車型的起步價大多數在10萬以下,很好地切入合資緊湊SUV的區間。對於定價不算很高,因此1萬多的優惠將相當具有吸引力了。

上汽通用雪佛蘭 創酷

售價:9.99-14.99萬元

作為合資小型SUV的先行者,創酷雖然不算很熱,但銷量一直都不錯,但受限於之前沒有改款,顏值有些落後與對手,使得整體熱度有所降低。如今新款更加出色的造型與較低的售價使得性價比很高。

全新創酷採用家族式造型設計變得更加的年輕時尚,分體格柵的造型使得前臉更具立體感。U型LED日間行車燈造型犀利,視覺效果出眾。飽滿車身造型與立體感很強的車尾造型很出色;輪眉凸起的線條多了一些硬派氣息。

相比老款,新款創酷的內飾實在是太時尚了;環繞式中控台黑棕的配色顯得大膽活潑;高配車型多媒體區域還有7英寸大屏,鋼琴烤漆工藝質感十足。相比它的外觀與內飾變化很大,由於是改款車型,它的空間仍然表現一般,勉強夠用。

創酷全系搭載的是一台1.4T發動機,143ps表現非常出色。日常使用與6AT變速箱搭配良好,換擋邏輯做得不錯。懸挂的韌性相當出色,但卻不會做得太硬影響舒適性。當然缺點還有有點,低速時換擋會有點頓挫。

北京現代 ix25

售價:11.98-18.68萬元

ix25作為現代最小型的SUV車型,它主打的仍是它時尚亮眼的外觀造型,同時還有比同級SUV較大的身材與超過的性價比。而且如今市場上也有不少優惠,屬於比較值得購買的一款SUV車型。

ix25的外觀整體感很出色,雖說第一眼不算很驚艷。但採用流體雕塑感念的前臉還是相當耐看的,多邊形的進氣格柵採用橫向鍍鉻條,質感十足。微微上揚的腰線配合懸浮式車頂造型整體呈現很硬朗陽剛。車尾則設計得比較飽滿敦實,卻不會太過張揚。

ix25的內飾造型則相對平淡一些,規整的中控台採用飛翼式設計,呈現簡潔的氣息。灰黑色的內飾搭配總體比較順眼,總的來說它的比較出色的就是均衡的空間與豐富的配置了。

ix25的動力總成非常豐富,能滿足不同消費者的需求。走量的1.6L車型125ps輸出中規中矩,日常代步足夠了。總的來說2.0L的車型會更好一些;6AT變速箱在平時行駛時換擋也相當出色。更高的1.6T車型動力是不錯,但性價比差了點。總的來說,ix25轉向輕盈,底盤舒適,是一台很好開的小型SUV。

東風悅達起亞 KX3

售價:11.28-17.78萬元

起亞相比現代而已,它們的風格不太相似。起亞的外觀設計更加激進一些,比較符合年輕人,但這樣受眾就比較窄了。為了打破這種障礙,KX3改款之後變得圓潤了很多。

作為改款車型,KX3的外觀造型變化不大。主要把前臉LED日間行車燈的位置往下移了之後,變得更加的協調可愛。圓潤的前臉配合大嘴的設計,很具特色。飽滿的車身線條流暢自然。車尾則採用簡潔的設計,耐看美觀。

全新KX3的內飾變化不大,設計感十足的內飾造型很有特色。層次感很強的中控台採用鋼琴烤漆工藝與紅色裝飾點綴,很吸人眼球。而且它的配置也空間都比較出色,很適合那些對配置比較注重的消費者。

全新KX3隻搭載了1.6L/1.6T發動機,2.0L車型不再推出。1.6L車型動力輸出一般,整體來說畢竟輕盈;對於日常代步的消費者已經足夠了。1.6T發動機動力更直接一些,而且這套雙離合變速箱做得相當出色,能媲美大眾的雙離合了。偏沉的懸挂需要適應一下,懸挂的調校則以家用舒適為目的。

上汽通用別克 昂科拉

售價:13.99-18.99萬元

昂科拉也迎來了改款,作為跟創酷差不多時間進入國內的小型SUV車型。當時市場空白,它可謂是佔了先機,但由於改款腳步較慢,性價比一般使得它銷量降低了不少。

新款昂科拉的外觀造型終於跟上潮流的,變得更加時尚年輕的造型很吸引年輕人。全新的家族式造型設計與別克其他車型有了延續,飽滿的前臉與鍍鉻裝飾檔次感十足。微微隆起的輪轂線條也使得它多了一些野性。車尾採用了新式樣的尾燈,視覺效果更出色。

作為比創酷高一個檔次的車型,昂科拉的內飾質感很強。簡潔的內飾造型是別克最新的家族式造型設計,很時尚年輕。而且厚道的用料與出色的做工也在細節上一一體現,唯一的弱點就是後排空間比較一般。

新款昂科拉也是全系搭載的是一台1.4T發動機,動力與創酷相差不大。而且也沒有採用雙離合變速箱,6AT保證了日常使用的平順性。1.4T動力出色,起步相當輕鬆。懸挂支撐性很高,具有較高的穩定性。但較硬的懸挂帶來的不好的影響就是舒適性一般,而且高速噪音偏高。

作為時下最火熱的幾款小型SUV車型,今天所推薦的這幾款價格有高有低。創酷自從改款之後,外觀造型終於不落後於競爭對手了;而且不到10萬的價格如今再加上優惠性價比很出眾。ix25則是一款實力比較均衡的車型,流體雕塑感念造型很出色;豐富的配置與寬敞的空間也是一大亮點。

起亞的KX3與ix25是兩種不同的路,它更加講求個性;老款太激進使得受眾較窄;新款變得笑容可掬與消費者更親近了。而且它降低的售價與豐富的配置也是它吸引年輕人的優勢。最後的昂科拉,雖則價格相對高一些,但它出色的外觀造型與檔次感很高的內飾質感都是它的底氣,如今加上優惠就更值得入手了。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

這些事情SUV可以輕鬆做到,轎車完全不行

、所說SUV有着以上優點,但是上下車對老人不友好以及盲區大、油耗大這些缺點還是存在的,關鍵還是根據自身需求出發選擇SUV還是轎車。

、

所說SUV有着以上優點,但是上下車對老人不友好以及盲區大、油耗大這些缺點還是存在的,關鍵還是根據自身需求出發選擇SUV還是轎車。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

痞子衡嵌入式:鏈接函數到8字節對齊地址或可進一步提升i.MXRT1xxx內核執行性能

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT上進一步提升代碼執行性能的經驗。

  今天跟大家聊的這個話題還是跟痞子衡最近這段時間參与的一個基於i.MXRT1170的大項目有關,痞子衡在做其中的開機動畫功能,之前寫過一篇文章 《降低刷新率是定位LCD花屏显示問題的第一大法》 介紹了開機動畫功能的實現以及LCD显示注意事項,在此功能上,痞子衡想進一步測試從芯片上電到LCD屏显示第一幅完整圖像的時間,這個時間我們暫且稱為1st UI時間,該時間的長短對項目有重要意義。

  痞子衡分別測試了代碼在XIP執行下和在TCM里執行下的1st UI時間,得到的結果竟然是XIP執行比TCM執行還要快50ms,這是怎麼回事?這完全顛覆了我們的理解,i.MXRT上TCM是與內核同頻的,Flash速度遠低於TCM。如果是XIP執行,即使有I-Cache加速,也最多與TCM執行一樣快,怎麼可能做到比TCM執行快這麼多。於是痞子衡便開始深挖這個奇怪的現象,然後發現了進一步提升代碼執行性能的秘密。

一、引出計時差異問題

  痞子衡的開機動畫程序是基於 \SDK_2.x.x_MIMXRT1170-EVK\boards\evkmimxrt1170\jpeg_examples\sd_jpeg 例程的,只是去了SD卡和libjpeg庫相關代碼。工程有兩個build,一個是TCM里執行(即debug),另一個是XIP執行(即flexspi_nor_debug)。

  項目板上的Flash型號是MX25UW51345G,痞子衡將其配成Octal mode, DDR, 166MHz用於啟動。項目板上還有兩個LED燈,痞子衡在LED燈上飛了兩根線,連同POR引腳一起連上示波器,用於精確測量1st UI各部分時間組成。

  示波器通道1連接POR引腳,表明1st UI時間起點;通道2連接LED1 GPIO,表明ROM啟動時間(進入用戶APP的時間點);通道3連接LED2 GPIO,做兩次電平變化,分別是1st圖像幀開始和結束的時間點。翻轉LED GPIO代碼位置如下:

void light_led(uint32_t ledIdx, uint8_t ledVal);

void SystemInit (void) {
    // 將LED1置1,標示ROM啟動時間
    light_led(1, 1);

    SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2));

    // ...
}

void APP_InitDisplay(void)
{
    // ...

    g_dc.ops->enableLayer(&g_dc, 0);

    // 將LED2置1,標示1st圖像幀開始時間點
    light_led(2, 1);
}

int main(void)
{
    BOARD_ConfigMPU();
    BOARD_InitBootPins();
    BOARD_BootClockRUN();
    BOARD_ResetDisplayMix();

    APP_InitDisplay();

    while (1)
	{
	    // ...
	}
}

static void APP_BufferSwitchOffCallback(void *param, void *switchOffBuffer)
{
    s_newFrameShown = true;

    // 將LED2置0,標示1st圖像幀結束時間點
    light_led(2, 0);
}

  上圖是痞子衡抓到的波形(30Hz,XIP),痞子衡一共做了四次測試,分別是30Hz LCD刷新率下的XIP/TCM以及60Hz LCD刷新率下的XIP/TCM,結果如下錶所示。表中的Init Time一欄表示的是開機動畫程序代碼執行時間(從SystemInit()函數開始執行到APP_InitDisplay()函數結束的時間),可以看到TCM執行比XIP執行慢近50ms,這便是奇怪問題所在。

代碼位置 LCD刷新率 POR Time Boot Time Init Time Launch Time
XIP 30Hz 3.414ms 10.082ms 34.167ms + 153ms 32.358ms
TCM 30Hz 3.414ms 10.854ms 33.852ms + 203ms 32.384ms
XIP 60Hz 3.414ms 9.972ms 18.142ms + 153ms 16.166ms
TCM 60Hz 3.414ms 10.92ms 17.92ms + 203ms 16.104ms

二、定位計時差異問題

  對於開機動畫代碼,XIP執行比TCM執行快這個結果,痞子衡是不相信的,於是痞子衡便用二分法逐步查找,發現時間差異是BOARD_InitLcdPanel()函數里的DelayMs()調用引起的,這些人為插入的延時是LCD屏控制器手冊里的要求,總延時時間應該是153ms,但是這個函數的執行在XIP下(153ms)和TCM里(203ms)時間不同。

static void BOARD_InitLcdPanel(void)
{
    // ...

#if (DEMO_PANEL ==  DEMO_PANEL_TM103XDKP13)
    // ...

    /* Power LCD on */    
    GPIO_PinWrite(LCD_RESET_GPIO, LCD_RESET_GPIO_PIN, 1);
    DelayMs(2);
    GPIO_PinWrite(LCD_RESET_GPIO, LCD_RESET_GPIO_PIN, 0);
    DelayMs(5);
    GPIO_PinWrite(LCD_RESET_GPIO, LCD_RESET_GPIO_PIN, 1);
    DelayMs(6);
    GPIO_PinWrite(LCD_STBYB_GPIO, LCD_STBYB_GPIO_PIN, 1);
    DelayMs(140);
#endif
    // ...
}

  所以現在的問題就是為何在TCM里執行DelayMs(153)需要203ms,而XIP執行下是精確的。讓我們進一步查看DelayMs()函數的原型,這個函數其實調用的是SDK_DelayAtLeastUs()函數,SDK_DelayAtLeastUs()函數從命名上看就很有意思,AtLeast即保證軟延時一定能滿足用戶設置的時間,但也可能超過這個時間。為何是AtLeast設計,其實這裏就涉及到Cortex-M7內核一個很重要的特性 – 指令雙發射,軟件延時的本質是靠CPU執行指令來消耗時間,但是CPU拿指令到底是單發射還是雙發射有一定的不確定性,因此無法做到精確,如果以全雙發射來計算,就能得出最小延時時間。

#define DelayMs                  VIDEO_DelayMs

#if defined(__ICCARM__)
static void DelayLoop(uint32_t count)
{
    __ASM volatile("    MOV    R0, %0" : : "r"(count));
    __ASM volatile(
        "loop:                          \n"
        "    SUBS   R0, R0, #1          \n"
        "    CMP    R0, #0              \n"
        "    BNE    loop                \n");
}
#endif

void SDK_DelayAtLeastUs(uint32_t delay_us, uint32_t coreClock_Hz)
{
    assert(0U != delay_us);
    uint64_t count = USEC_TO_COUNT(delay_us, coreClock_Hz);
    assert(count <= UINT32_MAX);

#if (__CORTEX_M == 7)
    count = count / 3U * 2U;
#else
    count = count / 4;
#endif
    DelayLoop(count);
}

void VIDEO_DelayMs(uint32_t ms)
{
    SDK_DelayAtLeastUs(ms * 1000U, SystemCoreClock);
}

  分析到現在,問題已經轉化成為何XIP下執行指令雙發射概率比TCM里執行指令雙發射概率更大,關於這個現象並沒有在ARM官方文檔里查找到相關信息,DelayLoop()循環里只是3條指令,XIP下執行肯定是在Cache line里,這跟在TCM里執行並沒有什麼區別。讓我們再去看看兩個工程的map文件,找到DelayLoop()函數鏈接地址,這個函數在兩個測試工程下鏈接地址對齊不一樣,這意味着測試條件不完全相同,或許這是一個解決問題的線索。

  XIP執行工程(flexspi_nor_debug),DelayLoop()函數地址8字節對齊:

*******************************************************************************
*** ENTRY LIST
***

Entry                       Address   Size  Type      Object
-----                       -------   ----  ----      ------
DelayLoop               0x3000'3169    0xa  Code  Lc  fsl_common.o [1]

  TCM執行工程(debug工程),DelayLoop()函數地址4字節對齊:

*******************************************************************************
*** ENTRY LIST
***

Entry                       Address   Size  Type      Object
-----                       -------   ----  ----      ------
DelayLoop                    0x314d    0xa  Code  Lc  fsl_common.o [1]

三、找到計時差異本質

  前面找到DelayLoop()函數鏈接地址差異是一個線索,那我們就針對這個線索做測試,不再讓鏈接器自動分配DelayLoop()函數地址,改為在鏈接文件里指定地址去鏈接,下面代碼是IAR環境下的示例,我們使用debug工程(即在TCM執行)來做測試。

  C源文件中在DelayLoop()函數定義前加#pragma location = “.myFunc”,即將該函數定義為.myFunc的段,然後在鏈接文件icf中用place at語句指定.myFunc段到固定地址m_text_func_start處開始鏈接:

#if defined(__ICCARM__)
#pragma location = ".myFunc"
static void DelayLoop(uint32_t count)
{
    // ...
}
#endif
define symbol m_text_func_start        = 0x00004000;

place at address mem: m_text_func_start     { readonly section .myFunc };

define symbol m_text_start             = 0x00002400;
define symbol m_text_end               = 0x0003FFFF;

place in TEXT_region                        { readonly };

  根據鏈接起始地址m_text_func_start的不同,我們得到了不同的結果,如下錶所示。至此真相大白,造成DelayMs()函數執行時間不同的根本原因不是XIP/TCM執行差異,而是鏈接地址對齊差異,8字節對齊的函數更容易觸發CM7指令雙發射,相比4字節對齊的函數在性能上能提升24.8% 。

m_text_func_start值 鏈接地址對齊 函數調用語句 實際執行時間
0x00004000 8n字節 DelayMs(100) 100ms
0x00004002 2字節,未能鏈接 N/A N/A
0x00004004 4字節 DelayMs(100) 133ms
0x00004008 8字節 DelayMs(100) 100ms

  現在我們得到了一個有趣的結論,Cortex-M7上將函數鏈接到8字節對齊的地址有利於指令雙發射,這就是進一步提升代碼執行性能的秘密。

  至此,i.MXRT上進一步提升代碼執行性能的經驗痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時發布到我的 博客園主頁、CSDN主頁、微信公眾號 平台上。

微信搜索”痞子衡嵌入式“或者掃描下面二維碼,就可以在手機上第一時間看了哦。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

pytorch入門2.2構建回歸模型初體驗(開始訓練)

pytorch入門2.x構建回歸模型系列:
pytorch入門2.0構建回歸模型初體驗(數據生成)
pytorch入門2.1構建回歸模型初體驗(模型構建)
pytorch入門2.2構建回歸模型初體驗(開始訓練)

經過上面兩個部分,我們完成了數據生成、網絡結構定義,下面我們終於可以小試牛刀,訓練模型了!
首先,我們先定義一些訓練時要用到的參數:

EPOCH = 1000  # 就是要把數據用幾遍
LR = 0.1  # 優化器的學習率,類似爬山的時候應該邁多大的步子。
# BATCH_SIZE=50

其次,按照定義的模型類實例化一個網絡:

if torch.cuda.is_available():  # 檢查機器是否支持GPU計算,如果支持GPU計算,那麼就用GPU啦,快!
    model = LinearRegression().cuda()  # 這裏的這個.cuda操作就是把模型放到GPU上
else:
    model = LinearRegression()  # 如果不支持,那麼用cpu也可以哦
# 定義損失函數,要有個函數讓模型的輸出知道他做的對、還是錯,對到什麼程度或者錯到什麼程度,這就是損失函數。
loss_fun = nn.MSELoss()  # loss function
# 定義優化器,就是告訴模型,改如何優化內部的參數、還有該邁多大的步子(學習率LR)。
optimizer = torch.optim.SGD(model.parameters(), lr=LR)  # opimizer

下面終於可以開始訓練了,但是訓練之前解釋一下EPOCH,比如我們有300個樣本,訓練的時候我們不會把300個樣本放到模型裏面訓練一遍,就停止了。即在模型中我們每個樣本不會只用一次,而是會使用多次。這300個樣本到底要用多少次呢,就是EPOCH的值的意義。

for epoch in range(EPOCH):
    # 此處類似前面實例化模型是,我們把模型放到GPU上來跑道理是一樣的。此處,我們要把變量放到GPU上,跑的快!如果不行, 那就放到CPU上吧。
    # 其中x是輸入數據,y是訓練集的groundtruth。為什麼要有y呢?因為我們要知道我們算的對不對,到底有多對(這裏由損失函數控制)
    if torch.cuda.is_available():
        x = Variable(x_train).cuda()
        y = Variable(y_train).cuda()
    else:
        x = Variable(x_train)
        y = Variable(y_train)
    # 我們把x丟進模型,得到輸出y。哇,是不是好簡單,這樣我們就得到結果了呢?但是不要高興的太早,我們只是把輸入數據放到一個啥都不懂(參數沒有訓練)的模型中,得到的結果肯定不準啊。不準的結果怎麼辦,看下一步。
    out = model(x)
    # 拿到模型輸出的結果,我們就要看看模型算的準不準,就是計算損失函數了。
    loss = loss_fun(out,y)
    # 好了好了,我已經知道模型算的準不準了,那麼就該讓模型自己去朝着好的方向優化了。模型,你已經是個大孩子了,應該會自己優化的。
    optimizer.zero_grad()  # 在優化之前,我們首先要清空優化器的梯度。因為每次循環都要靠這個優化器呢,不能翻舊賬,就只算這次我們怎麼優化。
    loss.backward()  # 優化開始,首先,我們要把算出來的誤差、損失倒着傳回去。(是你們這些模塊給我算的這個值,現在這個值有錯誤,錯了這麼多,返回給你們,你們自己看看自己錯哪了)

    optimizer.step()  # 按照優化器的方式,一步一步優化吧。

    if (epoch+1)%100==0:  # 中間每循環100次,偷偷看看結果咋樣。
        print('Epoch[{}/{}],loss:{:.6f}'.format(epoch+1,EPOCH,loss.data.item()))

上面我們訓練了1000(EPOCH=1000)次,應該差不多了。是時候看看訓練的咋樣啦!其實我們已經知道訓練的咋樣了,就是上面輸出的損失值,只不過是在訓練集上的。
下面我們就要看看在測試集上表現咋樣呢?

model.eval()  # 開啟模型的測試模式
# 拿到測試集中x的值,放到GPU上
if  torch.cuda.is_available():
    x = x_test.cuda()
#通過把x的值輸入模型,得到預測結果
predict = model(x)
# 那預測結果的值取出來,因為預測結果是封裝好的,現在h只要它的值。
predict = predict.cpu().data.numpy()
#畫個圖看看,到底擬合成啥樣了?
plt.plot(x.cpu().numpy(),y_test.cpu().numpy(),'ro',label='original data')
plt.plot(sorted(x.cpu().numpy()),sorted(predict),label='fitting line')
plt.show()

看看圖,結果還湊合吧,要想結果更好需要進一步對模型的結構、超參數進行設置,我們之後在學。
到此為止,我們用pytorch就已經建立完,並且訓練完一個線性回歸模型了,我們可以回顧下,多看幾遍,仔細回想一下這裏面到底發生了什麼。
完整的代碼地址如下:github

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

03 . Django之騰訊雲短信

簡介

由於項目在註冊、登錄、找回密碼 時需要發送短信驗證的功能,我們使用騰訊雲短信做。

為什麼要用騰訊雲短信呢? 因為註冊就送 100條免費短信 的額度。

實現

註冊騰訊雲

註冊一個騰訊雲賬戶,騰訊雲中提供了很多功能:雲服務器、雲存儲你、雲直播、雲短信等很多功能。

註冊地址:https://cloud.tencent.com/

註冊並要實名認證

開通雲短信

創建應用

創建應用並將應用中生成的 SDK AppID和 App Key 複製下來,之後通過python發送短信時需要用到。

創建簽名

在騰訊雲短信簽名時需要認證,認證需要填寫簽名類型:網站、APP、小程序、公眾號,前三種需要提供企業資質等複雜的東西,個人公眾號認證會比較便捷,所以推薦個人開發的話使用 公眾號 進行簽名。

so,咱們需要先 申請一個公眾號 然後 創建簽名

申請微信訂閱號

註冊地址:https://mp.weixin.qq.com/

創建簽名

創建模板

發送短信

上述的準備工作做完中我們開通相關服務並獲取到如下幾個值:

# 創建應用,獲取到 appid 和 appkey
# 創建簽名,獲取 簽名內容
# 創建模板,獲取 模板ID

接下來開始使用Python發送短信。

安裝SDK

 pip install qcloudsms_py

基於SDK發送短信

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
from qcloudsms_py import SmsMultiSender, SmsSingleSender
from qcloudsms_py.httpclient import HTTPError
def send_sms_single(phone_num, template_id, template_param_list):
    """
    單條發送短信
    :param phone_num: 手機號
    :param template_id: 騰訊雲短信模板ID
    :param template_param_list: 短信模板所需參數列表,例如:【驗證碼:{1},描述:{2}】,則傳遞參數 [888,666]按順序去格式化模板
    :return:
    """
    appid = 112142311  # 自己應用ID
    appkey = "8cc5b87123y423433412387930004"  # 自己應用Key
    sms_sign = "幽夢DevOps"  # 自己騰訊雲創建簽名時填寫的簽名內容(使用公眾號的話這個值一般是公眾號全稱或簡稱)
    sender = SmsSingleSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num, template_id, template_param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "網絡異常發送失敗"}
    return response
def send_sms_multi(phone_num_list, template_id, param_list):
    """
    批量發送短信
    :param phone_num_list:手機號列表
    :param template_id:騰訊雲短信模板ID
    :param param_list:短信模板所需參數列表,例如:【驗證碼:{1},描述:{2}】,則傳遞參數 [888,666]按順序去格式化模板
    :return:
    """
    appid = 112142311
    appkey = "8cc5b87123y423423412387930004"
    sms_sign = "幽夢DevOps"
    sender = SmsMultiSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num_list, template_id, param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "網絡異常發送失敗"}
    return response
if __name__ == '__main__':
    result1 = send_sms_single("18621048481", 548760, [666, ])
    print(result1)
    result2 = send_sms_single( ["18621048481", "15131255089", "15131255089", ],548760, [999, ])
    print(result2)
關於頻率限制

騰訊雲短信後台可以進行 短信頻率 的限制。

但是,由於我們是免費用戶所以無法進行設置,只能使用默認的配置(30秒發1條/1小時發5條/1天發10條)。

!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

※網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!