You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

123 lines
4.6 KiB

%\begin{content}
%「」
\chapter{常用模块}
micropython 的内置模块,到官网查看相关文档,在代码目录的 ports/c6x/docs 目录下有一份手册,可以先熟悉
一下。这里只讲 c6x 相关的模块。
\section{tic6x}
tic6x 模块中包含以下函数和类。
\subsection{Flash}
前面的移植中如果添加了 Flash 模块,则 Flash(0) 会以 LFS2 文件系统挂载成 “/”,在启动文件 \_boot.py 中有如下内容:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
import os, tic6x
bdev = tic6x.Flash()
try:
vfs = os.VfsLfs2(bdev, progsize=512)
os.mount(vfs, "/")
except:
import _setup
vfs = _setup.setup(bdev)
del os, tic6x, bdev, vfs
\end{minted}
\subsection{mww, mwh, mwb, mdw, mdh, mdb,mds}
内存读取和修改的函数, mw[w,h,b] 是分别以字,半字,字节写内存。md[w,h,b,s] 分别以字,半字,字节,字符串显示内存的内容,
例如:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> from tic6x import mdw
>>> mdw(0xb8000000, 32)
b8000000: fff80000 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
b8000020: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
b8000040: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
b8000060: ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff
\end{minted}
\subsection{Symbol}
前面的移植中如果添加了符号表的功能,则通过这个类的接口,可以直接调用 C 源码中全局符号:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> from tic6x import Symbol
>>> s = Symbol('testUart')
>>> s()
\end{minted}
如果前面的移植中包含 Flash 支持,则会自动生成 boot.py,该脚本在启动的时候会自动将所有支持的符号导入到 symbols 类
中,前面的例子可以直接通过下面的方式调用:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> from tic6x import symbols
>>> s = symbols()
>>> s.testUart()
>>> s.testUart.address
>>> s.testUart.data
>>> s.testUart.data = 0xdeadbeef # testUart 是全局变量
...
\end{minted}
如果 c 代码中的全局函数,在没有调用的情况下,可能不会自动出现最终的 elf 文件中。可以通过将函数名添加到前面的 builtins.txt \ref{sec:builtin} 文件中,
每一行一个函数名。重新编译后,该函数会出现在 symbols 中。
\subsection{ymodem}
 在命令行可以通过 ymodem 来接收文件: 
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> from tic6x import ymodem
>>> ymodem.rx()
CCC
\end{minted}
 当出现C字符后,通过ymodem将文件发送上去,会自动保存在 Flash 的文件系统里面。
\section{machine}
machine 模块中有几个比较有用的函数,这里单独提一下。
\subsection{reset}
如果在 mp\_port.c 中实现了 void mp\_tic6x\_hard\_reset(),这里可以通过它来实现重启:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> from machine import reset
>>> reset()
\end{minted}
\subsection{halt}
可以通过 halt 来退出 micropython 解释器:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> from machine import halt
>>> halt()
\end{minted}
\subsection{mem8,mem16,mem32}
可以通过 mem8,mem16,mem32 (8,16,32 分别按8位,16位,32位操作):
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> from micropython import const
>>> from machine import mem16
>>> addr = const(0x78000000)
>>> mem16[addr]
>>> mem16[addr] = 0xaa55
\end{minted}
来修改寄存器或内存。
\section{uctypes}
upy 的内置模块 uctypes 值得单独提一下。可以通过它与 C 的数据类型进行交互。详细的使用规则请参考官方文档。
\subsection{struct}
struct(addr, descriptor, layout\_type=NATIVE) 将对应地址转为C对应的布局。
\subsection{addressof}
获取一个对象的地址,例如:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> import ctypes
>>> addr = bytearray()
>>> ctypes.addressof(addr)
\end{minted}
\subsection{bytes\_at}
将一段地址转为 bytes 对象,可以通过 bytes 对象进行读取:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> import ctypes
>>> addr = ctypes.bytes_at(0xc0000000, 16)
\end{minted}
\subsection{bytearray\_at}
将一段地址转为 bytearray 对象,可以通过 bytearray 对象进行读写:
\begin{minted}[bgcolor=lightgray!30,fontsize=\scriptsize]{python}
>>> import ctypes,os
>>> addr = ctypes.bytearray_at(0xc0000000, 128)
>>> addr[:] = os.urandom(128)
\end{minted}