2024 - 8

#include <iostream>
#include <string>

//链表结构
template <typename T>
struct Node
{
    T data;
    Node<T>* next = nullptr;
};

//定义栈抽象类LinkStack
template <typename T>
class LinkStack
{
public:
    LinkStack();
    ~LinkStack();
public:
    bool isEmpty();
    int size();
    void push(T&& data);
    T pop();
    T top();
private:
    Node<T>* phead = nullptr;
    int count;
};

template <typename T>
LinkStack<T>::LinkStack()
        :phead(new Node<T>),count(0)
{
    std::cout << std::hex << this << std::dec << ": run LinkStack constructor" << std::endl;
    std::cout << "new Node phead: " << std::hex << phead << std::dec <<std::endl;
};

template <typename T>
LinkStack<T>::~LinkStack()
{
    std::cout << std::hex << this << std::dec <<": run LinkStack destructor" << std::endl;
    Node<T> * temp = nullptr;
    while (nullptr != phead)
    {
        temp = phead->next;
        std::cout << "delete Node: " << std::hex << phead << std::dec << " -> " << phead->data  << std::endl;
        delete phead;
        phead = temp;
    }
};
//栈大小
template <typename T>
int LinkStack<T>::size()
{ return count; };

//空栈
template <typename T>
bool LinkStack<T>::isEmpty()
{ return count == 0; };


//插入
template <typename T>
void LinkStack<T>::push(T&& data)
{
    Node<T> *pnode = new Node<T>;
    std::cout << " -->> new Node: " << std::hex << pnode << std::dec <<std::endl;
    std::cout << "     push data: " << data << std::endl;
    pnode->data = data;
    pnode->next = phead->next;
    phead->next = pnode;
    count++;
};

//弹出
template <typename T>
T LinkStack<T>::pop()
{
    if(nullptr != phead->next) //判断空栈
    {
        Node<T>* pdel = phead->next;
        std::cout << " <<-- delete Node: " << std::hex << pdel << std::dec <<std::endl;
        std::cout << "         pop data: " << pdel->data << std::endl;
        phead->next = phead->next->next;
        T data = std::move(pdel->data);
        delete pdel;
        count--;
        return data;
    } else
        throw std::out_of_range("空栈"); 
};

//获取栈顶元素
template <typename T>
T LinkStack<T>::top()
{
    if(nullptr != phead->next)
        return phead->next->data;
    else
        throw std::out_of_range("空栈"); 
};

int main()
{
    LinkStack <std::string> lstack;
    std::cout << "new lstack: " << std::hex << &lstack << std::dec <<std::endl;
    lstack.push("LinkStack Hello");
    lstack.push("0123456789");
    lstack.push("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    lstack.push("abcdefghijklmnopqrstuvwxyz");

    std::cout << "Stack.size()=" << lstack.size() << std::endl;
    std::cout << "Stack top data=" << lstack.top() << std::endl;
    
    //输出栈
    while(!lstack.isEmpty())
    { lstack.pop(); }
    
    //int lstack2
    auto lstack2 = new LinkStack<int>;
    std::cout << "new lstack2: " << std::hex << lstack2 << std::dec <<std::endl;
    lstack2->push(100);
    lstack2->push(200);
    lstack2->push(300);
    lstack2->push(400);
    lstack2->push(500);
    lstack2->push(600);

    std::cout << "Stack2->size()=" << lstack2->size() << std::endl;
    std::cout << "Stack2 top data=" << lstack2->top() << std::endl;
    
    //弹出栈顶元素
    lstack2->pop();
    
    delete lstack2;
    std::cout << "delete lstack2: " << std::hex << lstack2 << std::dec <<std::endl;
    
    return 0;
}

image.png

IPL

CPU上电后首先跑到的是rom code,顾名思义代码保存在特殊的ROM中,且是只读的。ROM code跑完后会读取NOR Flash 0地址的位置,这个位置就是IPL文件存放的位置,IPL里主要功能是做一些基础的硬件初始化,例如设定当前DDR参数,以及GPIO/IIC相关等。

IPL_CUST

IPL初始化的是一些共有的硬件模块,IPL_CUST中会根据当前板子的实际情况初始化客制化板子硬件的可执行的二进制文件,例如客制化的GPIO管教,IIC配置。

MXPT

分区配置相关的二进制档案。

UBOOT

UBOOT的二进制文件存放分区。

UBOOT_ENV

UBOOT的环境变量存放分区。

LOGO

在NVR设备上会使用,存放的是开机logo相关的配置。

SPI-NOR的BOOT分区中的内容是不建议改动的,若有不符合公板release的地方,可能会导致系统无法启动。

BOOT的位置在linux在mtd block0的位置上,对应的设备节点/dev/mtdblock0。

BOOT分区之后的分区,统称为SYS分区,SYS分区是可以修改的,根据实际的使用情况,大致分为四个类别:

KERNEL

存放内核的二进制文件。

ROOTFS

如题。

miservice

这是公板定义的一个分区,它用来存储mi的库、一些配置文档,文件系统默认jiffs2。

customer

用户自己定制的分区。

set mtdids 'nor0=nor0';\
set bootargs 'root=/dev/mtdblock3 rootfstype=squashfs ro init=/linuxrc LX_MEM=8000000 mma_heap=mma_heap_name0,miu=0,sz=0x4600000 mma_memblock_remove=1 cma=2M mtdparts=nor0:0x4F000(BOOT),0x1000(ENV),0x200000(KERNEL),0xCB0000(rootfs),0xA0000(customer)';\
set bootcmd 'sf probe 0;sf read 0x23000000 KERNEL 0x200000; bootm 0x23000000; dcache on ; bootm 0x23000000';\
set mtdparts 'mtdparts=nor0:0x4F000(BOOT),0x1000(ENV),0x200000(KERNEL),0xCB0000(rootfs),0xA0000(customer)';\
save;reset