標籤: 網頁設計公司

  • 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可輕鬆IAP

    痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可輕鬆IAP

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT系列ROM中的FlexSPI驅動API實現IAP

      痞子衡的技術交流群里經常有群友提問: i.MXRT中的FlexSPI驅動API到底怎麼用啊?這個問題已經出現過好幾次了,本來痞子衡不打算專門為這個寫文章的,因為這部分內容在芯片手冊System Boot章節里的最後一節ROM APIs里其實介紹得非常詳細了,但是既然還是有不少朋友在問這個,看起來手冊里的內容藏得有點深,這麼好的東西被埋沒太可惜了,那麼今天痞子衡就跟大家再認真聊一聊。

    一、ROM API簡介

    1.1、API產生背景

      i.MXRT系列都是Flashless(沒有內置NVM)的芯片,所以BootROM必不可少。BootROM是個很特殊的東西,本質上它是一個完整的C代碼寫成的系統級App,這個系統級App專門用於從外部存儲器中加載用戶級App執行。簡單地說,BootROM就是PC機里的BIOS。

      BootROM代碼是存放在專門的ROM區域的(前面講i.MXRT系列沒有內置NVM,其實不夠準確,其實是有內部ROM空間的,只不過這個ROM區域用戶無法下載程序使用,因此等效於沒有NVM),ROM顧名思義Readonly,所以BootROM代碼只能隨着芯片一起Tapeout,代碼無法更改(其實也有ROM patch機制,以後再介紹)。

      ROM空間其實挺大的,從64KB到512KB不等,因芯片啟動功能複雜程度而異。下圖是i.MXRT1050系列的BootROM所佔空間,ROM起始地址是0x200000(起始地址在i.MXRT上都一樣),ROM大小為96KB(這是標準啟動功能所要的代碼長度。在i.MXRT1010上是64KB – 精簡啟動功能,在i.MXRT1170上是256KB – 複雜啟動功能)。

      BootROM代碼其實並沒有佔滿全部ROM空間,總有些剩餘空間(因為工藝原因,ROM空間都是8/16KB倍數),這部分空間浪費了着實可惜。如果我們能把SDK里的一些常用模塊驅動(比如WDOG)順便放進去供用戶調用,既充分利用ROM空間,也為用戶節省Flash空間,豈不是一舉兩得。此外,BootROM功能代碼中也有一些現成模塊驅動(比如各種啟動設備存儲器驅動接口)可以一併導出,這便是API由來。

    1.2、API設計實現

      有了API想法,現在就是設計實現了。其實i.MXRT ROM API設計並不是重頭開始的,在這個MCU系列被主推之前,Kinetis系列也曾當紅過,Kinetis中也內置了ROM,並且提供了ROM API,痞子衡之前為此寫過一篇文章 《飛思卡爾Kinetis系列MCU啟動那些事(11)- KBOOT特性(ROM API)》。 i.MXRT ROM API設計思路完全復用了Kinetis ROM API的設計。

      API說到底就是一個個功能函數的結合,我們知道工程代碼都是由鏈接器自動分配的,因此每個函數實際鏈接地址是無法預期的(在鏈接文件里給每個函數分配固定地址鏈接這種方法不在考慮範疇,當函數數量眾多時,這種方法太麻煩),業界上一個比較通用的做法是定義成員是函數指針的結構體,i.MXRT ROM API就是採用的業界通用方式,下面bootloader_api_entry_t便是i.MXRT1060中API原型,g_bootloaderTree就是實例:

    typedef struct
    {
        const uint32_t version;
        const char *copyright;
        void (*runBootloader)(void *arg);
        const hab_rvt_t *habDriver;
    
        //!< FlexSPI NOR Flash API
        const flexspi_nor_driver_interface_t *flexSpiNorDriver;
    
        const nand_ecc_driver_interface_t *nandEccDriver;
        const clock_driver_interface_t *clockDriver;
        const rtwdog_driver_interface_t *rtwdogDriver;
        const wdog_driver_interface_t *wdogDriver;
        const stdlib_driver_interface_t *stdlibDriver;
    } bootloader_api_entry_t;
    
    // Bootloader API Tree
    const bootloader_api_entry_t g_bootloaderTree = {
        .copyright = "Copyright 2018 NXP",
        .version = MAKE_VERSION(1, 0, 0),
        .runBootloader = run_bootloader,
        .habDriver = &hab_rvt,
    
        .flexSpiNorDriver = &g_flexspiNorDriverInterface,
    
        .nandEccDriver = &g_nandEccDriverInterface,
        .clockDriver = &g_clockDriverInterface,
        .rtwdogDriver = &g_rtwdogDriverInterface,
        .wdogDriver = &g_wdogDriverInterface,
        .stdlibDriver = &g_stdlibDriverInterface,
    };
    

      從上面代碼我們可以看出,bootloader_api_entry_t成員好像並不是函數指針,是的,為了分組方便,bootloader_api_entry_t成員還是一個個結構體,它的這些結構體成員(比如flexspi_nor_driver_interface_t)才是真正包含一個個函數指針的結構體。API從功能來分一共提供了7類:HAB、FlexSPI NOR、NAND ECC、Clock、RT-WDOG、WDOG、stdlib。

      設計到這裏,我們通過g_bootloaderTree結構體常量就可以調用所有的API函數了,最後剩下的問題就是如何在ROM里找一個確定的地方保存隨機鏈接的g_bootloaderTree地址(只要4字節即可)。是的,還是Kinetis ROM API用的那個巧妙的方法,下面是BootROM工程的startup文件(Keil版),BootROM將g_bootloaderTree的地址放到了中斷向量表第8個向量的位置處(該向量為ARM Cortex-M未定義的系統向量),因此0x20001c處開始的4bytes便固定是g_bootloaderTree地址。

                    PRESERVE8
                    THUMB
    
    ; Vector Table Mapped to Address 0 at Reset
    
                    AREA    RESET, DATA, READONLY
                    EXPORT  __Vectors
                    EXPORT  __Vectors_End
                    EXPORT  __Vectors_Size
                    IMPORT  |Image$$ARM_LIB_STACK$$ZI$$Limit|
                    IMPORT  g_bootloaderTree
    
    __Vectors       DCD     |Image$$ARM_LIB_STACK$$ZI$$Limit|
                    DCD     Reset_Handler
                    DCD     DefaultISR
                    DCD     HardFault_Handler
                    DCD     DefaultISR
                    DCD     DefaultISR
                    DCD     DefaultISR
                    DCD     g_bootloaderTree
                    DCD     0
                    DCD     0
                    DCD     0
                    DCD     SVC_Handler
                    DCD     DefaultISR
                    DCD     0
                    DCD     DefaultISR
                    DCD     DefaultISR
    		        ;; ...
    

    1.3、API調用方法

      了解了前面介紹的ROM API產生背景與設計實現,它的調用方法就非常簡單了,以WDOG API調用為例,只需要如下簡單3句代碼:

    // 找到API根結構體
    #define g_bootloaderTree (*(bootloader_api_entry_t **)0x0020001c)
    // 定義WDOG模塊配置變量
    wdog_config_t config;
    // 調用API中WDOG_Init()
    g_bootloaderTree->wdogDriver->WDOG_Init(WDOG1, config);
    

    1.4、支持API的i.MXRT型號

      截止目前,i.MXRT1xxx系列一共出了7款型號,但並不是每個型號都開放了ROM API,最早誕生的三款型號(105x、1021、1015)就並沒有開放API(不是沒有API,而是沒有嚴格測試),其餘型號都支持API。

    RT芯片型號 是否支持ROM API
    i.MXRT117x 支持
    i.MXRT1064 支持
    i.MXRT106x 支持
    i.MXRT105x 未開放
    i.MXRT1021 未開放
    i.MXRT1015 未開放
    i.MXRT1011 支持

    二、API之FlexSPI驅動

      前面鋪墊了太多ROM API設計細節,到這裏才算進入正題,本文其實主要是要跟大家聊如何利用API里的FlexSPI NOR驅動實現IAP。痞子衡在前面鋪墊那麼多的原因其實主要是想告訴大家,API里的每個驅動都是經過完善測試的,尤其是這個FlexSPI NOR驅動,更是經過了千錘百鍊,無論是易用性、運行穩定性還是Flash型號的支持度上都是首屈一指的。

      對於JESD216標準下的串行SPI接口Flash驅動,大家知道更多的可能是RT-Thread技術總監朱天龍大神的開源 SFUD 項目,但痞子衡告訴你,i.MXRT ROM API里的這個串行Flash驅動也毫不遜色(持續維護與優化了近6年,歷經多款MCU的ROM,是真正的產品級),只是不如開源項目那麼知名,不過它的源代碼也是開源在SDK里的(\SDK\middleware\mcu-boot\src\drivers\flexspi_nor),BSD-3-Clause許可證。

    2.1 FlexSPI驅動原型

      flexspi_nor_driver_interface_t便是FlexSPI NOR驅動的原型,尋常的讀寫擦功能自然不在話下,除此以外,API裏面還有一個非常厲害的xfer()函數,這個函數可以用來實現其他定製化的Flash操作函數,有興趣的朋友可以進一步去研究。

    typedef struct
    {
        uint32_t version;
        status_t (*init)(uint32_t instance, flexspi_nor_config_t *config);
        status_t (*program)(uint32_t instance, flexspi_nor_config_t *config, uint32_t dst_addr, const uint32_t *src);
        status_t (*erase_all)(uint32_t instance, flexspi_nor_config_t *config);
        status_t (*erase)(uint32_t instance, flexspi_nor_config_t *config, uint32_t start, uint32_t lengthInBytes);
        status_t (*read)(uint32_t instance, flexspi_nor_config_t *config, uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);
        void (*clear_cache)(uint32_t instance);
        status_t (*xfer)(uint32_t instance, flexspi_xfer_t *xfer);
        status_t (*update_lut)(uint32_t instance, uint32_t seqIndex, const uint32_t *lutBase, uint32_t seqNumber);
        status_t (*get_config)(uint32_t instance, flexspi_nor_config_t *config, serial_nor_config_option_t *option);
    } flexspi_nor_driver_interface_t;
    

    2.2 FlexSPI驅動使用示例

      FlexSPI驅動使用基本三步走,先調用get_config()獲取完整FlexSPI模塊配置,然後調用init()函數去初始化FlexSPI以及訪問Flash獲取SFDP表信息,最後就是調用Flash操作函數(比如erase())。

    // 找到API根結構體
    #define g_bootloaderTree (*(bootloader_api_entry_t **)0x0020001c)
    
    // 定義FlexSPI, Flash配置變量
    flexspi_nor_config_t config;
    serial_nor_config_option_t option;
    option.option0.U = 0xC0000008; // QuadSPI NOR, Frequency: 133MHz
    uint32_t instance = 0;
    
    // 調用API中get_config()函數
    g_bootloaderTree->flexSpiNorDriver->get_config(instance, &config, &option);
    // 調用API中init()函數
    g_bootloaderTree->flexSpiNorDriver->init(instance, &config);
    // 調用API中erase()函數
    g_bootloaderTree->flexSpiNorDriver->erase(instance, &config, 0x40000, 0x1000);
    

    2.3 FlexSPI驅動特點

      因為FlexSPI NOR驅動API來自於BootROM,因此其在使用上有一些小小的限制,也算是其特點吧。FlexSPI驅動API里並沒有提供Flash連接的Pinmux配置,其Pinmux配置已經寫死在init()函數中,就是ROM支持啟動的FlexSPI PORTA上的那些pin(片選是SS0)。

      在上面的使用示例代碼中,你會看到option.option0.U = 0xC0000008代碼,這算是FlexSPI驅動最大的特點了,這是一個簡化的option配置word(其原型可在芯片手冊里找到),通過這個簡化的option,用戶可以輕鬆配置來訪問不同廠商的Flash,下面是常用的Flash模式配置值。

    • QuadSPI NOR - Quad SDR Read: option0 = 0xc0000008 (133MHz)
    • QuadSPI NOR - Quad DDR Read: option0 = 0xc0100003 (60MHz)
    • HyperFLASH 1V8: option0 = 0xc0233009 (166MHz)
    • HyperFLASH 3V0: option0 = 0xc0333006 (100MHz)
    • MXIC OPI DDR (OPI DDR enabled by default): option=0xc0433008(133MHz)
    • Micron Octal DDR: option0=0xc0600006 (100MHz)
    • Micron OPI DDR: option0=0xc0603008 (133MHz), SPI->OPI DDR
    • Micron OPI DDR (DDR read enabled by default): option0 = 0xc0633008 (133MHz)
    • Adesto OPI DDR: option0=0xc0803008(133MHz)
    

    2.4 FlexSPI驅動用作IAP

      IAP其實就是在App中實現Flash擦寫,單純從技術上來說並不是一個很難的東西。但i.MXRT上很多時候App代碼本身也在同一片Flash里執行(也叫XIP),而市面上很多Flash都是不支持RWW(Read-While-Write)的,這就導致一個問題,當你調用Flash操作函數去擦寫Flash時,CPU又需要繼續去Flash獲取指令,違反了RWW,因此你只能把Flash相關操作函數全部放在RAM中去執行(這涉及分散加載了,對於初級嵌入式用戶來說稍微有點難)。

      現在我們有了ROM API,FlexSPI驅動代碼體全部都在ROM空間里,並不佔用Flash空間,因此不存在RWW問題,真是天然為IAP而生,再也不用再管什麼分散加載這麼麻煩的事了。

    三、FlexSPI API業界應用

      最後再介紹一下i.MXRT FlexSPI API在業界的應用,這個API其實並不小眾,目前已被主流IDE和調試工具用作i.MXRT Flash下載算法。

    3.1 用於IAR下載算法

      如果你的IAR版本夠新,能夠支持i.MXRT1060等型號,隨便打開一個i.MXRT1060 SDK工程,在工程Option里找到Debugger,然後進入Flashloader配置,你會看到頁面里有Extra parameters一欄,在下面的解釋里有這個參數的示例,它就是前面2.3節里介紹的option0。有了這種方式設計的Flash下載算法,你再也不用手動更新下載算法文件去支持不同的Flash了,改參數就行了。

    3.2 用於J-Link下載算法

      目前最新的Jlink驅動里的下載算法也是基於ROM API的,痞子衡有一個開源項目,收集了i.MXRT所有型號的下載算法源代碼工程,其中jlink算法是最全的,其他IDE算法還在陸續完善中。

    https://github.com/JayHeng/imxrt-tool-flash-algo

      至此,i.MXRT系列ROM中的FlexSPI驅動API實現IAP痞子衡便介紹完畢了,掌聲在哪裡~~~

    歡迎訂閱

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

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

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

    ※台北網頁設計公司全省服務真心推薦

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※推薦評價好的iphone維修中心

  • 自已做動畫及編寫程序搞清楚最大堆的實現原理

    自已做動畫及編寫程序搞清楚最大堆的實現原理

    目錄

    • 背景
    • 概念
    • 最大堆
      • 最大堆的線性存儲
      • 動畫實現最大堆加入新元素
      • 代碼實現最大堆加入新元素
      • 動畫實現最大堆取出最大元素
      • 代碼實現最大堆取出最大元素
      • 程序測試
    • 最大堆的應用–優先隊列
    • 寫在最後

    背景

    • 二叉樹是數據結構中的重點,也是難點。二叉樹比數組、棧、隊列等線性結構相比複雜度更高,想要做到心中有“樹”,需要自己動手畫圖、觀察、思考,才能領會其真諦。
    • 在上篇文章《自己動手作圖深入理解二叉樹、滿二叉樹及完全二叉樹》中,我們對完全二叉樹有了一定認識,該文將對一種特殊的完全二叉樹”最大堆”進行底層研究。

    概念

    堆(heap)通常是一個可以被看做一棵二叉樹的數組對象。堆總是滿足下列性質:

    • 堆總是一棵完全二叉樹。
    • 堆中某個節點的值總是不大於或不小於其父節點的值;

    最大堆

    • 根節點最大的堆叫做最大堆
    最大堆的線性存儲
    • 由於堆是一種特殊的完全二叉樹,可以利用數組集合形成線性存儲的數據結構。
    /**
     * 最大堆的底層實現--數組集合形成線性存儲的數據結構
     *  * @author zhuhuix
     * @date 2020-06-28
     */
    public class MaxHeap<E extends Comparable<E>> {
    
        // 存放元素的數組集合
        private ArrayList<E> list;
    
        MaxHeap() {
            this.list = new ArrayList<>();
        }
    
        // 得到左孩子索引
        private int getLeftChildIndex(int i) {
            return (2 * i + 1);
        }
    
        // 得到右孩子索引
        private int getRightChildIndex(int i) {
            return (2 * i + 2);
        }
    
        // 得到父結點索引
        private int getParentIndex(int i) {
            if (i == 0) {
                throw new IllegalArgumentException("非法索引值");
            } else {
                return ((i - 1) / 2);
            }
        }
    }
    
    動畫實現最大堆加入新元素
    • 加入到數組集合尾部的元素與父結點進行比較,通過上浮操作,保證所有子結點不能大於父結點。
    代碼實現最大堆加入新元素
    /**
     * 最大堆的底層實現
     *
     * @author zhuhuix
     * @date 2020-06-28
     */
    public class MaxHeap<E extends Comparable<E>> {
    
        // 存放元素的數組集合
        private ArrayList<E> list;
    
        MaxHeap() {
            this.list = new ArrayList<>();
        }
    
        // 得到左孩子索引
        private int getLeftChildIndex(int i) {
            return (2 * i + 1);
        }
    
        // 得到右孩子索引
        private int getRightChildIndex(int i) {
            return (2 * i + 2);
        }
    
        // 得到父結點索引
        private int getParentIndex(int i) {
            if (i == 0) {
                throw new IllegalArgumentException("非法索引值");
            } else {
                return ((i - 1) / 2);
            }
        }
    
        // 添加元素
        public void add(E e) {
            this.list.add(e);
            /**
             * 將加入的結點與父結點進行比較:
             * 如果加入的結點大於父結點,則進行上浮
             * 直至新結點小於或等於父結點為止
             */
    
            // 獲取當前添加元素在數組中的索引
            int i = this.list.size() - 1;
            while (i > 0) {
                E current = this.list.get(i);
                E parent = this.list.get(getParentIndex(i));
                // 如果父結點元素大於當前加入的元素,則進行交換
                if (parent.compareTo(current) < 0) {
                    // 交換新加入的結點與父結點的位置
                    Collections.swap(this.list, i, getParentIndex(i));
                } else {
                    break;
                }
                i = getParentIndex(i);
            }
        }
        
    }
    
    動畫實現最大堆取出最大元素
    • 獲取最大堆中的根結點,即為最大元素;並把尾部結點放置到根結點,並通過下沉操作,把子結點中的最大元素移動根結點。
    代碼實現最大堆取出最大元素
    /**
     * 最大堆的底層實現
     *
     * @author zhuhuix
     * @date 2020-06-28
     */
    public class MaxHeap<E extends Comparable<E>> {
    
        // 存放元素的數組集合
        private ArrayList<E> list;
    
        MaxHeap() {
            this.list = new ArrayList<>();
        }
    
        // 得到左孩子索引
        private int getLeftChildIndex(int i) {
            return (2 * i + 1);
        }
    
        // 得到右孩子索引
        private int getRightChildIndex(int i) {
            return (2 * i + 2);
        }
    
        // 得到父結點索引
        private int getParentIndex(int i) {
            if (i == 0) {
                throw new IllegalArgumentException("非法索引值");
            } else {
                return ((i - 1) / 2);
            }
        }
    
        // 查找最大元素
        public E findMax() {
            if (this.list.size() == 0) {
                return null;
            }
            // 最大堆中的元素永遠在根結點
            return this.list.get(0);
        }
    
        // 取出最大元素
        public E getMax() {
            if (findMax() != null) {
                E e = findMax();
    
                /**
                 * 取出最大元素后,需要把堆中第二大的元素放置在根結點:
                 * 將根結點元素與最後面的元素進行交換,
                 * 讓最後面的元素出現在根結點,並移除最大元素
                 * 將根結點的元素與左右孩子結點比較,直至根結點的元素變成最大值
                 */
                int i = 0;
                Collections.swap(this.list, i, this.list.size() - 1);
                this.list.remove(this.list.size() - 1);
    
                // 通過循環進行當前結點與左右孩子結點的大小比較
                while (getLeftChildIndex(i) < this.list.size() && getRightChildIndex(i) < this.list.size()) {
                    int leftIndex = getLeftChildIndex(i);
                    int rightIndex = getRightChildIndex(i);
    
                    // 通過比較左右孩子的元素哪個較大,確定當前結點與哪個孩子進行交換
                    int index = this.list.get(leftIndex).compareTo(this.list.get(rightIndex)) > 0 ? leftIndex : rightIndex;
                    if (this.list.get(i).compareTo(this.list.get(index)) < 0) {
                        Collections.swap(this.list, i, index);
                    } else {
                        // 如果當前結點都大於左右孩子,則結束比較
                        break;
                    }
                    i = index;
                }
    
                return e;
            } else {
                return null;
            }
        }
    }
    
    
    程序測試
    /**
     * 最大堆的底層實現--測試程序
     *
     * @author zhuhuix
     * @date 2020-06-28
     */
    public class MaxHeapTest {
        public static void main(String[] args) {
            MaxHeap<Integer> maxHeap = new MaxHeap<>();
    
            // 將10個数字加入形成最大堆
            int[] arrays = {19,29,4,2,27,0,38,15,12,31};
            for (int i = 0; i < arrays.length; i++) {
                maxHeap.add(arrays[i]);
            }
    
            // 依次從堆中取出最大值
            for (int i = 0; i < arrays.length; i++) {
                System.out.println("第"+(i+1)+"次取出堆目前的最大值:"+maxHeap.getMax());
            }
        }
    }
    
    

    最大堆的應用–優先隊列

    優先隊列:出隊的和順序與入隊的順序無關,只與優先級相關;
    優先隊列通常可以採用最大堆的數據結構來實現。

    /**
     * 用最大堆的數據結構實現優先隊列
     * 
     * @author zhuhuix
     * @date 2020-06-28
     */
    public class PriorityQueue<E extends Comparable<E>>  {
        private MaxHeap<E> mhp;
        PriorityQueue() {
            mhp=new MaxHeap<>();
        }
    
        // 入隊
        public void enqueue(E e) {
            mhp.add(e);
        }
    
        // 優選級最高的元素出隊
        public E dequeue() {
            return mhp.getMax();
        }
    
        // 查看優先級最高的元素
        public E getFront() {
            return mhp.findMax();
        }
    }
    
    

    寫在最後

    • 以上通過畫圖、動畫演示、代碼編寫對堆與最大堆的概念和底層實現方式,都作了深入分析;作為最大堆的反向結構,最小堆的實現也是一樣,讀者可參考以上動畫和代碼,動手練習。
    • 畫圖、編碼不易,請點贊、收藏、關注三連!!!

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

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

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

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

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

    ※超省錢租車方案

  • 日本國土百萬年的惡夢 每日數百噸的福島輻射污染水

    文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

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

  • 印度環境部長:解決首都空污時間 會比北京短

    摘錄自2019年11月23日中央通訊社印度報導

    印度環境、森林與氣候變遷部部長賈瓦德卡爾昨天(22日)在印度國會下院答詢時聲稱,空污需要大規模運動來解決,「北京花了15年的時間,我們將花費更少時間(解決空污問題)」。

    印度包含新德里在內國家首都區每年冬天因農民焚燒農田殘梗、車輛排放、建築工地揚塵、6000家餐廳用炭火燒烤雞肉、窮人焚燒垃圾取暖等諸多因素,陷入嚴重空氣污染,但印度政府一直無法拿出有效解決對策。空污在今年11月更有惡化趨勢,引發民眾不滿。

    賈瓦德卡爾指出,政府已針對城市制定監測空氣污染計畫,目前在全印度355個城市監測空污。此外,政府正每天展開工作以消除空污威脅,包括2018年啟用東、西部外環高速公路,且已把碳排放降低了22%;在第6期汽車廢氣排放標準(BS VI)明年4月實施後,汽車廢氣排放量將可減少80%。

    他還把空污問題與氣候變遷聯繫起來,並說印度的總發電量在2030年之前,將有40%是來自可再生能源;而且印度的綠地覆蓋率不斷增加,使印度成為可達到綠地覆蓋率標準的少數國家之一,更五度在國家首都區種植更多樹木,以替代因興建地鐵而砍伐掉的樹木。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

    ※台北網頁設計公司全省服務真心推薦

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

  • 馬來西亞最後一頭蘇門答臘犀牛病逝 全球剩80頭

    摘錄自2019年11月24日中央通訊社馬來西亞報導

    馬來西亞最後一隻蘇門答臘犀牛,25歲的母犀牛伊曼自2014年被捕獲後,一直在野生動物保護區接受妥善照顧,牠今天(24日)因癌病逝於婆羅洲(Borneo)沙巴(Sabah)。沙巴野生動物部門(Sabah Wildlife Department)主任奧古斯丁(Augustine Tuuga)說:「伊曼的死亡比預期要快,但我們知道,牠已經開始承受極大痛苦。」

    蘇門答臘犀牛是體型最小的犀牛,曾廣布亞洲各地,野生蘇門答臘犀牛如今已近乎絕種,據保育人士估計,目前全球僅剩約30至80頭,大多棲息在蘇門答臘和印尼所管轄的婆羅洲地區。馬來西亞2015年宣布野生蘇門答臘犀牛絕種,最後一頭公蘇門答臘犀牛今年5月離世。

    保育團體國際犀牛基金會(International Rhino Foundation)說,棲地減少和盜獵導致蘇門答臘犀牛生存於孤立區域,代表牠們繁衍困難,數十年內可能就會滅絕。

    自2011年以來,馬來西亞不斷嘗試以體外受精方式,繁殖人工飼養的蘇門答臘犀牛,但迄今尚未成功。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

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

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

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

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

  • 韓國入冬後空氣污染物八成來自中國

    摘錄自2019年11月21日大紀元報導

    韓、日、中三國對大氣污染物流動的共同研究顯示,韓國境內有高達三成的細懸浮污染物(PM2.5)來自中國,入冬後這個數字更飆高至八成。

    據韓聯社報導,韓國環境部下屬國立環境科學院20日發布報告概要指,韓日主要城市由國內因素導致污染的比例分別為51%和55%,而中國是91%。

    從國外成因來看,韓國的空氣污染物中,來自中日兩國的各占32%和2%,其餘來自朝鮮、蒙古、東南亞等地區。從韓日兩國流入中國的空氣污染物比重分別僅占2%和1%,從韓中兩國流入日本的比重分別為8%和25%。

    然而,如果將時間範圍限定在12月至3月,中國的空氣污染物對韓國的影響更為嚴重。據韓國國立環境科學院的調查,今年1月11日至15日韓國空氣污染物中只有18%至31%來自國內因素,其餘69%至82%來自國外,其中中國占絕大多數。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

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

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

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

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

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

  • 違法噴灑遭禁殺蟲劑 孟山都將付3億罰款

    摘錄自2019年11月22日中央通訊社美國報導

    美國農業生技巨擘孟山都(Monsanto)今天(22日)同意認罪,承認在夏威夷毛伊島(Maui)的設施對研究作物違法噴灑遭禁的劇毒殺蟲劑,將支付1000萬美元(約新台幣3億532萬元)罰款。

    法新社報導,孟山都在提交給檀香山聯邦地區法院的法庭文件中承認,2014年在農場谷(Valley Farm)對玉米種子等作物噴灑Penncap-M殺蟲劑,即使已知環境保護署於2013年禁用這款化學物。

    審理此案的加州中區聯邦檢察官韓納(Nick Hanna)說:「此案的違法行徑對環境、周圍社區和孟山都工人構成威脅。」他說:「聯邦法律與相關規範規定,使用管制和危險化學物的每個人,都有責任確保產品是經過安全儲存、運送與使用。」

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

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

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

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

    南投搬家前需注意的眉眉角角,別等搬了再說!

    新北清潔公司,居家、辦公、裝潢細清專業服務

  • 新宿市民測定所 發表嬰幼兒奶粉輻射檢查報告

    文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

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

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

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

    ※幫你省時又省力,新北清潔一流服務好口碑

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

  • 一口氣投80億人民幣 比亞迪建長沙、青島兩個新能源車生產基地

    比亞迪汽車於5月18日與湖南省長沙市雨花區經開區簽署合作備忘錄,比亞迪將投資50億元人民幣(下同),在長沙比亞迪汽車城二期興建電動卡車及專用車生產基地,計畫年內投產。   長沙比亞迪專案將由電動轎車、電動客車和電動卡車及專用車三部分組成。電動卡車及專用車專案,現已動工建設,是比亞迪電動卡車及專用車全球製造中心,含整車及相應配套零部件,目標向全中國工廠提供電動底盤、車橋等核心部件。比亞迪預計2016年將達產2500輛,規劃至2020年達5000輛年產能,2025年擴建到10000輛年產能。   此外,比亞迪在青島市城陽區投資30億元的新能源汽車專案一期目前已開工建設,這是青島城陽首個新能源汽車產業專案,也是建區以來引進的最大工業專案。根據規劃分三期建設完成,預計2017年全部建成。專案全部建成後,將年產電動汽車5000輛,年可實現銷售收入105億元。   此專案位於棘洪灘軌道交通裝備製造產業園內,規劃佔地1000畝,主要生產純電動轎車、中巴、小巴、物流車等產品,以及從事車輛電池、電機、電控等核心零部件的研發和製造。

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

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

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

  • 比亞迪新能源車夯!2015年可望售出350億人民幣

    根據中國汽車工業協會公佈的統計資料顯示,2015年1至4月份,比亞迪新能源汽車銷量已超過1.2萬輛。同時第一季,比亞迪歸屬於上市公司股東的淨利潤達1.2億元人民幣(下同),同比增幅高達910%。   按4月份單月的銷量資料來看,比亞迪乘用車總體銷量為32260輛,年減29.85%。但新能源汽車銷量為3646輛,其中秦2625輛,e6電動車890輛,騰勢131輛,實現了正向增長。   據比亞迪相關人士介紹,2015年,比亞迪還將推出包括鎖定個人消費者的插電式混合動力汽車「唐」,中型及緊湊型插電式混合動力SUV車型「宋」和「元」,以及新能源商用車「商」等。除此之外,在特種車輛方面,比亞迪也會逐步加快研發並推出應用於礦山、港口、機場及倉儲等領域的車型,以及應用於環衛、城市物流等領域的特種車輛。   而比亞迪副總裁廉玉波在出席內地電動車研討會時透露,預料今年可售出約值300億元至350億元的新能源汽車,料全年可售出約6.7萬部新車,佔公司汽車業務一半收入,並有望達到「自給自足」盈利水準。   他表示,現時比亞迪每月可售出1,000部純電動車e6,純電動巴士每月售約600部。且位於惠州的電池廠3月起投產,有利提升產能;其中較受歡迎的混能車「秦」,6月時產能將增至6,000架。而比亞迪與戴姆勒合資生意的純電動車「騰勢」,每月約售出500部,估計年底時將增至3,000至4,000部。

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

    新北清潔公司,居家、辦公、裝潢細清專業服務