训练一个新闻概括模型

数据集 – feilongfl/ChineseNewsSummary

使用爬虫爬取网络新闻,使用gpt3.5和下面提示词制作。

你是一个用于整理新闻的AI助手,请根据分割线后爬虫在{{ $json.isoDate }}爬取的新闻,使用简体中文按照包含:title,summary,class,time四个节点的json格式输出结果。
title字段:请为新闻起一个30到60个字的简体中文标题。应当是包含上下文简洁说明的结论性内容的陈述句,词汇简单,信息全面。
class:请分类为:财经、汽车、房产、家居、教育、科技、社会、时政、体育、游戏、娱乐等。
time字段:如果新闻中有提供时间,请使用新闻中的时间;否则使用爬虫时间。时间应当以年/月/日格式输出,例如:2024/1/16。
summary字段:应当用100字以内简单的简体中文陈述已经发生的事实,着重于结论和支撑结论的数据,不要假设和预测,不要重复标题。请过滤原文中可能包含的问题或反问、猜测/情绪化表达、政治口号、联系方式、股票代码或广告词。如果原文有晦涩或不常见的词汇或多重否定,请换用简单的词语进行描述。
---
{{ $json.contentSnippet }} 

模型

基于mistral7b。这个模型在中文方面表现不错,7b足以胜任概括任务。

训练

基于llama factory, 由于我的显存只有24g,因此context size被我限制在了2k。

训练时显存占用约为23.6G。

训练时只使用新闻input小于1k的语料,如果输入长新闻会出现问题。

结果 – feilongfl/Mistral-7B-cn_news-v0.1

使用4位后,显存占用约为5.2G。

组装3D打印机(下手前调查)

最近上头了,要搞3d打印机,而且主要玩打印机,所以准备DIY

2023/10

方案一览

目前找到的方案有:

  1. Voron 2.4
  2. Voron Tridents

软件

控制器

  1. Klipper
  2. Marlin

建模

  1. blender
  2. meshlab – archlinux 编译失败
  3. openscad

切片

Voron

Voron 2.4 (flying Gantry)

看起来具有更高的可玩性

优点

  1. 时间长,玩家多,mod多

缺点

  1. 系统缺陷:违背运动学定律,导致系统一部分弯曲[1]
  2. 不易维护,皮带老化速度快[2]

Voron Tridents (tripoints leveling)

相对便宜,但是对于玩打印机来说,价格不是决定因素

优点

  1. 构建相对容易,校准快 [3]

缺点

  1. 高处过重,系统共振[1]
  2. 高度受限,不能超过250mm[2]

Voron 0.1

优点

缺点

他人分享

成功例

  1. 3000元方案: https://tieba.baidu.com/p/8195524624?pid=146420825662&cid=0#146420825662
  2. https://tieba.baidu.com/p/7385199457?pid=139616747000&cid=0#139616747000
  3. 带兔子多色: https://www.bilibili.com/video/BV1GF411t7pF/?spm_id_from=trigger_reload&vd_source=15f3a73f7a06c58e94d62416ea4036d1
  4. b站野生小虾米:https://www.bilibili.com/video/BV1Mu411z7AZ/?spm_id_from=..search-card.all.click&vd_source=15f3a73f7a06c58e94d62416ea4036d1
    • 型材 misumi:全套hfs:500 – 经济型nfs:300+
    • 电机
      • ab电机 0.6NM
      • z电机 0.42NM
      • 信浓,雷赛等没有推荐
    • 开关电源
      • 品牌
        • 台湾明纬
        • 深圳明纬
        • 河南明伟
      • LRS – 薄电源
      • 350W,热床220V的情况,200W就足够
      • 风扇很吵,6010风扇,可以换
      • 负公差 – 容易套入,但是不用过于在意负公差
    • 皮带
      • 9mm,10mm会和打印件摩擦
      • 同步轮最好9,买不到可以用10
    • 热床
      • 3kg铝板较重,可以最后装
      • 用玻璃当PEI板材测试,防止损失大
    • 螺母
      • 船型螺母 – 可以从外面装
      • 不要全用弹珠螺母
        • 部分位置会造成位置过长
        • 弹珠螺母不会掉下去
    • 拖链
      • 开口式 – 推荐,容易布线
      • 闭口式 – 不推荐,穿线不容易
      • 尺寸: 10×11
    • 调平 – 微动开关
      • TTC 微动
      • 更换型号需要修改配置 – z自动偏移
    • 电气导轨
      • 如果用理线槽,需要变短,注意计算长度,留出1mm余量

失败例

  1. 高度过高 – https://tieba.baidu.com/p/7291311093?pid=138670967892&cid=0#138670967892

2. 纹路缺陷 – 无答案

参考

  • [1] Voron 2.4 & Tridents 缺陷
  • [2]Voron Trident vs Voron 2.4: The Differences

https://all3dp.com/2/voron-trident-vs-2-4-differences/#

  • [3] Which Voron should you build

成果

购物清单,目前花了1600左右,准备组装voron v0.2r1,等待货物送达中.BOM如下:

https://docs.google.com/spreadsheets/d/1Ek6zdi4ttX-TjzbVQYM0EhhznqHYpk7oFu0q86mKzZw/edit?usp=sharing

选择理由

  1. 足够小,作为初次接触这个领域,一个较小的机器可以比较容易的移动。如果是voron2.4的话,可能就不是那么容易移动了。
  2. 第一次组装,希望能够在一个相对成熟的平台上尽可能熟悉各个组件。同时也希望能够以较小的成本而进行试错。其他版本的voron来试错成本有些高。
  3. 找到了B站“小明就小明吧”帮忙购买了所有非电子组件,有一位经验者带路,一定程度上能够减少翻车概率😄(之所以没有买电子相关组件,是因为我对电子领域有一些了解,简单翻看各个控制板的文档,基本就能理解他们实现了什么功能和优缺点;但是对于其他领域,我暂时还没有足够的经验,作为上班族,为了减少拼装周期,UP帮忙购买能够帮我节省大量的时间去挨家选购,很赞)
  4. UP“有空来玩玩”关于voron 0.2做了一套相对完善的说明教程,后续参考应该比较容易

但是也有一些缺点:

  1. 对于追求3d打印来说,打印面积过小,性价比不高
  2. 这个价格其实已经可以买到拓竹的成品机器了,然而DIY性能不如成品的机率比较大

BOM 变动

  1. 主要是减少试错成本的方针进行的
  2. 为了拆装容易,不需要封箱。因此pdd几块钱买个防尘罩
  3. 用电安全很重要,花了约100元把原本几块钱的220v开关换成了漏电保护器,并且放在强电箱内。也购买了绝缘胶带,准备视情况对开关电源的220v电源也进行处理。不过一般情况下不打算靠电闸来开关,打算接个智能插座。
  4. 操作安全也很重要,护目镜、手套都是推荐购买的。

Aipi-Eyes-S1 调试笔记

lvgl

作为gl库挺好用的,但是缺少上层ui支持,纯手写有点累人。

squareline说不上好用。

lwip

断言错误:timeout != null

运行后,lwip报错如下

Assertion "sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty" failed at line 3
11 in /workspace/aipi/aithinker_Ai-M6X_SDK/components/net/lwip/lwip/src/core/timeouts.c

解决方法:

lwipopts_user.h中定义,默认是10,适当增大即可消除这个错误

错误本质是timeout的mem区域定义过小,导致melloc失败

#define MEMP_NUM_SYS_TIMEOUT 20

socket没有必要断开

http是基于socket的一坨文本,传输过程中没有必要一包一个连接,可以一个连接用到底。

正好避免了不断的内存申请和释放。

大数据recv

jellyfin数据包比较大,登录的数据包就超过了3k,超越了MSS大小(1360)。

没想到什么好的解决方法,只能开个大buffer。

讨巧的办法:如果数据到达MSS极限就再收一次,希望不会有恰好的。正常的也许判断下第一包里面的数据size会好些。

cJSON

cJSON的子元素不要delete,全部是用完直接delete根部即可。不然会导致越界错误。

minicom 在lf时换行

参考:https://unix.stackexchange.com/questions/283924/how-can-minicom-permanently-translate-incoming-newline-n-to-crlf

$HOME/.minirc.dfl添加

pu addcarreturn    Yes

Jellyfin

登录

大部分指令整理在:

https://github.com/feilongfl/JellyfinBox/issues/5

使用登录数字可以避免在不到4寸的屏上面戳密码

apikey

需要套一层:Mediabrowser Token=”$token”

ref: https://github.com/jellyfin/jellyfin/issues/7190

使用http://jellyfin.lan:8096/api-docs/swagger/index.html可以调试大部分API

转码

对于MCU播放来说,flac之类的无损过于庞大了(也许也能播放),而且音频文件格式也不少,为了通用,通过jellyfin可以自动转码,重点在于transcodingContainer参数

curl 'http://192.168.10.110:8096/Audio/ca6d68582302e6e6fdcb576974db06e9/universal?UserId=c45083f066864d658bbeb7fe9a9b443d&DeviceId=TW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE2LjAuMC4wIFNhZmFyaS81MzcuMzZ8MTY5NjA1OTYyNjg2MA11&audioBitRate=96000&audioCodec=mp3&transcodingContainer=mp3&api_key=86d7bbfa776748a1afa742f28b8c4cc9&PlaySessionId=1696157558093&StartTimeTicks=0&EnableRedirection=true&EnableRemoteMedia=false' \
  -H 'Accept: */*' \
  -H 'Cache-Control: no-cache' \
  -H 'Pragma: no-cache' \
  -H 'Range: bytes=0-' \
  -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36' | mplayer -

转码2

貌似jellyfin不支持转换pcm格式,需要改改代码

核心处理在:Jellyfin.Api/Helpers/AudioHelper.cs

通过ffmpegCommandLineArguments来控制ffmpeg进行转码。

编译jellyfin需要在ubuntu等有dpkg的平台才可以编译(linux)

自动转码PCM

参考:https://github.com/jellyfin/jellyfin/pull/10321

jellyfin编译

装ubuntu

装nodejs

参考:https://github.com/nodesource/distributions

装dotnet

参考:https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#scripted-install

编译jellyfin-web

需要有个客户端来调试

参考:https://github.com/jellyfin/jellyfin-web

编译jellyfin

调试参考:https://github.com/jellyfin/jellyfin#running-from-the-command-line

./build -t native -p linux.amd64

生成的文件竟然在../bin,这个构建系统可能是有问题吧…

重置服务器

错过了初次向导,导致无法设置密码时候可以使用

rm ~/.config/jellyfin/ -rv

AIPI

声音 – i2s

不知道为啥官方不给个声音例程。。。

官方默认的声音是aipi-eyes-s2的,s1需要用8388_pcm

而且翻遍sdk也没找到解码器…

测试硬件方法

参考:https://segmentfault.com/a/1190000016652277

测试声音可以用下面指令生成一段测试音乐,方便测试

ffmpeg -y -i d.mp3 -acodec pcm_s16le -f s16le -ac 2 -ar 16000 16k.pcm
xxd -i 16k.pcm 16kpcm.h

但是需要注意flash大小,并且注意section。也就能存几句歌左右,不过能听个大概。

同时,DMA每次传输有上限(具体没测试),不能一次传完大的音乐。需要利用isr多次传输。

采样率相关

输出音乐如果女变男或者节奏变慢,需要加快i2s采样率。

如果变成nightcore,那么应该减少采样率

杂音

感觉是传输中有多余字符或字符丢失,但是目前没找到什么好办法

-> Jellyfin服务器下载的数据ffmpeg播放没有问题

-> curl下载数据和MCU 的 lwip socket读取数据不一致(串口打印)

-> python试一下发现socket读回来的ffmpeg也有杂音

-> 看起来socket直接读回来的数据和http下载的有区别

-> 比较两个文件,除了HTTP头,还多出两千多个byte,这个应该就是原因了

-rw-r–r– 1 feilong feilong 15257333 10月 2日 14:19 test.bin
-rw-r–r– 1 feilong feilong 15255040 10月 2日 14:23 wget.pcm

-> 除了标头以外,找到了下面4种差异

0x0a,0x31,0x30,0x30,0x30,0x30,0x0d,0x0a,0x0d
0x0d,0x0a,0x30,0x0d,0x0a,0x0d,0x0a
0x0d,0x0a,0x31,0x30,0x30,0x30,0x30,0x0d,0x0a
0x0d,0x0a,0x63,0x36,0x30,0x30,0x0d,0x0a

看起来HTTP会添加长度说明,奇数个byte的时候,打破了16bit对齐的音频数据

Stable Diffusion 照片修改(不使用webui)

最近沉迷于stable diffusion的研究,一般的教程都在讲述如何使用webui来生成图片。但是作为一名程序员,单纯点点点是满足不了我想理解它底层原理的欲望。

本文叙述基于Diffusers和ROCM(Amd GPU)的简单示例。

安装

注:基于Manjaro系统

新建python工程

最近感觉poetry比较火的样子 🙂

mkdir sd_script
cd sd_script
poetry new .

# 我习惯把venv放在工程目录
poetry config virtualenvs.in-project true --local
poetry env use python3.10

# 一顿乱装
poetry add diffusers transformers accelerate scipy safetensors omegaconf
# 参考:https://pytorch.org/get-started/locally/
poetry source add --priority=supplemental pytorch https://download.pytorch.org/whl/rocm5.4.2
poetry add --source pytorch torch torchvision torchaudio

# 进入venv
source .venv/bin/activate.fish

写点代码

from diffusers import StableDiffusionImg2ImgPipeline, DPMSolverMultistepScheduler
from PIL import Image

pipe = StableDiffusionImg2ImgPipeline.from_single_file(
    # https:civitai.com/models/7240
    "./model/model/MeinaMix.v13.safetensors"
)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(
    pipe.scheduler.config, use_karras_sigmas=True
)

# rocm不配拥有名字
pipe.to("cuda")

# 明明不是R18 ...
if pipe.safety_checker is not None:
    pipe.safety_checker = None

# 天灵灵,地灵灵,神灵灵,祖宗灵灵。
prompt = "masterpiece, best quality, ultra detail,(2girl), upper body,close up, smile, happy, open eye, with glasses"
nprompt = "NSFW,(worst quality, low quality:1.4), (bad_prompt_version2:1), muscular, greyscale, monochrome, lineart, 2koma, 3koma, 4koma, manga, 3D, 3Dcubism, pablo picasso, disney, marvel, mutanted breasts, mutanted nipple, cropped, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry,  artist name, lowres, trademark, watermark, title, text, deformed, bad anatomy, disfigured, mutated, extra limbs, ugly, missing limb, floating limbs, disconnected limbs, out of frame, mutated hands and fingers, poorly drawn hands, malformed hands, poorly drawn face, poorly drawn asymmetrical eyes, (blurry:1.4), duplicate, (worst quality, low quality:1.4)"

init_image = Image.open('./resources/xxxxx.jpg').convert("RGB")
init_image.thumbnail((512, 512))

image = pipe(prompt=prompt, 
             negative_prompt=nprompt, 
             image=init_image, 
             strength=0.45, 
             guidance_scale=7.5,
             num_inference_steps=100
             ).images[0]
image.save("output.png")

成果

下面是一张在上海后滩拍摄的照片。

原图(人脸已扣掉,两个扣脚大汉😄)

输出(两个萌妹 😄)

stable-diffusionclipdrop XL 体验

刷B站时候刷到了https://clipdrop.co/stable-diffusion,找chatgpt生成了提示词。

记录下体验结果

chatgpt

我希望为文字生成图片工具生成提示词, 要求如下:
- 使用英文一句话描述
- 图像内有三个日系画风女孩
- 三个女孩在PCB板上合作搬运电阻和电容
- PCB使用蓝色阻焊
- PCB上应该有没有焊接的零件散落

prompt是根据下面图片描述的:

chatgpt输出



根据您的要求,我为文字生成图片工具生成了以下提示词(英文描述):

"Three Japanese-style girls collaborate on a PCB board, moving resistors and capacitors, with scattered unassembled components on a blue solder-masked PCB."

希望这个提示能够满足您的需求,为您的文字生成图片工具提供准确的描述!

直接使用这个生成了三次元图片,效果不好

一次修改

Three Japanese-style anime girls collaborate on a PCB board, moving resistors and capacitors, with scattered unassembled components on a blue solder-masked PCB.

添加 anime限定词,限定为二次元世界

二次修改

Three cute Japanese-style anime girls collaborate on a PCB board, moving resistors and capacitors, with scattered unassembled components on a blue solder-masked PCB.

有点丑,添加cute限定,结果就比较好了。

但是,这貌似是一个抽奖的过程,附上几张我觉得比较好的图片。

chatgpt learn – Guidelines

learn from DLAI – Learning Platform Beta (deeplearning.ai)

Write clear and specific instructions

Use delimiters – 使用分隔符明确指令和数据

例如告诉chatgpt三个反引号内是处理目标,“`目标文本“`

Ask for structured output – 要求结构化输出

输出json/html以便后续处理

Check whether conditions are satisfied – 要求模型检查前置条件

告诉模型如果输入不对时候主动提示不正确

Few-shot prompting – 提供示例

给一个例子会更好点

Give the Model time to think

Specify the steps to complete a task – 要求模型按步骤完成

可以避免“一步到错”

Instruct the model to work out its own solution before rushing to a conslusion – 要求结论给出前,模型先计算完成

不然模型可能只比较结论,不比较过程

Model Limitations

Hallucination (虚假知识)

回复看起来真实的错误内容

要求模型先从文本中找到相关内容,使用引用内容来回答问题。

散热学习笔记

从零开始学散热

陈继良

热设计的意义

温度的影响

  • LED温度敏感性强
    • 温度浮动导致光输出的变化和发光峰值波长的漂移
    • 结温上升影响光输出效率(同样亮度,产热更多)
    • 温度上升,光质量控制能耗上升
  • 温度对电子产品影响
    • 运行寿命
      • 芯片温度每上升10度,运行寿命减半
        • 正常工作温度内
        • 70-140度,寿命减少更快
    • 能源效率
    • 性能稳定性

温度对芯片的影响原理

  • 硅芯片由多种材料制成,不同材料热膨胀系数不同。温度变化导致芯片内部不同材料间存在相互作用力,长时间积累造成断裂。(类似金属疲劳?)
  • 液态器件(电解电容)
    • 温度升高,密封材料性能下降;水汽进入产生反应,增大爆炸风险;高温下电解液沸腾,压力超过外壳承受能力,嘭
  • 腐蚀
    • 芯片运行产生电场,和空气水分、盐分一同诱发电化学反应;温度越高,反应越快(指数级)
  • 氧化物分解
    • 良好环境下,氧化物分解,电气性能改变
    • 反应速度和温度呈现指数关系
  • 芯片功耗
    • 分类
      • 动态功耗
        • 电容充放电
          • 网络电容
          • 输入负载
        • P/N MOS 同时打开产生的瞬时短路电流
      • 静态功耗
        • 逻辑门没有翻转时的能量损耗
          • P(static) = V(dd)I(leakage)
    • 随芯片制程减小,动态功耗下降,静态功耗上升
    • 静态功耗随温度上升而指数上升

电气性能变化

  • 芯片运行最优温度只位于一个点或一小段温度区间

解决芯片热可靠性

  • 内:优化芯片封装材料和制造工艺(芯片封装热设计)
  • 外:增加散热器(产品系统热设计)

热设计方案特征

  1. 产品热安全
  2. 低成本
  3. 可维护性
  4. 稳定性
  5. 异常检出
  6. 外观
  7. 噪音控制(风冷)
  8. 优秀的工况适应性和异常情景反应策略(这句没看懂)
  9. 节能环保

移植zephyr到AT32_SURF_F437开发板

感谢Artery公司提供开发板,以及Artery各位工程师的技术支持。

背景

今年上半年收到了Artery公司 木一川 先生的邀请,有幸白嫖到了AT32的开发板。开发板搭载的AT32F437ZMT7芯片和其他国内芯片公司的xx32产品类似,芯片内核采用ARM Cortex-M4,外设和STM32F1相似。

题外话: 在写这篇文章的时候,翻阅了以前写的GD32移植时候看到当时刚刚考完日语N2,一年半时间飞逝,N1考试因为疫情连续取消了三回。

zephyr移植

基础知识:

请参考gd32移植

对于传统的嵌入式软件开发,可能会使用IAR、KEIL等IDE,而绝大多数的芯片厂家默认提供的BSP也往往基于这些工具进行开发。 然而对于开源项目来说,这些工具费用高昂,并且对工作流的细节控制很难实现。因此,对于第一次接触zephyr项目的朋友优先理解编译器(和目标平台架构相关,对于at32来说是gcc)和构建系统(cmake)的作用。

zephyr系统利用了大量linux的开发工具:

  • 为了解决c语言大量宏(marco)的依存关系,zephyr使用linux的kconfig工具来管理宏。
  • 为了解决各个平台的硬件区别,zephyr基于使用linux的devicetree框架对硬件设备从Board,SOC,Arch三个层级对硬件平台进行描述。但是zephyr项目的设备树会生成c语言头文件而不是dtb

为了对开发平台进行调试,一般会使用pyocd或者OpenOCD这两个工具来建立JTAG或者SWD连接,配合gdb对芯片进行调试。 一般gdb不会单独运行,在命令行中调试即使配合tui也是十分痛苦的,但是对于一些高手,利用hook,可以打造出更顺手的调试环境。我个人一般会配合vscode或者gdbgui等工具一同使用,这些GUI界面一般也可以使用hook,并且使用gdb的终端。

以上工具,一般在zephyr项目中也不会直接调用,而是使用west命令进行操作。

AT32移植

zephyr项目支持多种架构和大量厂商的芯片,一般情况下,我们只需要制作最外层的Board级别的移植,即可完成。

但是本次Artery公司尚未被zephyr项目支持,但是arm cortex-m4是被zephyr项目支持的架构arch,所以需要SOC级别的移植。

如果你使用的是RenesasRH850或者infineonTriCore系列芯片,那么你将会面对一个arch级别的移植,这会面对很大的工作量,目前我也没有经历过这个级别的适配。

  • 供应商支持
    • zephyr会对供应商进行管理,只有记录在vendor-prefix.txt内的供应商名称,才可以作为vendor出现在设备树中。
  • 板极支持(boardat_surf_F437)
    • 板级设备树
      • 这里一般会描述LED、按键、串口等板级外设的配置。
    • 板级kconfig配置
      • 对一些设定进行配置,例如LOG等级,IP地址等。
    • 调试工具配置
      • openocdpyocd以及各个厂家特有的下载工具等进行配置,以便对目标设备进行调试和烧写。
    • 文档
      • 一般会描述开发板的功能和简单的编译烧写方法。
  • 芯片级支持(SOCAT32F437ZMT7)
    • soc启动代码(soc.c)
      • 对系统启动进行一些初期设定,arm架构一般会调用cmsis接口SystemInit
    • 芯片级dts
      • 对芯片级设备进行描述,例如定时器,flash等。
    • 芯片级KCONFIG
      • 对芯片系列进行定义。
    • 芯片片内外设驱动
      • 串口、定时器等外设驱动。
      • 这部分代码会大量利用c语言宏的一些特性,熟练掌握可以很大程度的提升c语言宏的使用技巧。
  • 供应商硬件抽象层(对于本次移植来说是hal_artery)
    • 在适配驱动的过程中,如果完全重新写一遍外设驱动的话会产生很大的工作量;同时一般芯片厂商会提供一定的代码以便加速开发。但是,这些代码的维护和zephyr之间关系不大,因此作为module存在。
    • 在使用这些代码的时候,我们需要十分小心。因为c语言没有package或者namespace这些方法对符号的作用域进行限缩,所以在引入供应商HAL代码的时候,符号会重名,这种时候需要对HAL名称进行修正。万幸是这些修正项目往往比较规则,即使在版本更新后,一般也只需要再做一遍即可。如果希望更加一劳永逸的办法,建议了解coccinelle
    • HAL库的另外一大工作量是芯片的引脚复用的管理(pinctrl)。一般情况下,我们对引脚的处理仅仅局限在某一个系列的兼容,然而在zephyr项目中,我们需要对整个供应商的引脚IP进行描述。并且,zephyr项目一般不允许手动修改这些描述,因此制作一个脚本程序是必要的,例如:hal_gigadevice: gd32pinctrl.py
    • 作为zephyr模块,根目录应当包含zephyr文件夹和module.yml文件。这些文件的修改可以参考west工具的说明。

应用篇 (zephyr-SUMP

谈论了很久的移植,最后来聊一下产品的开发。本节将简单的说明下zephyr应用开发的方式,并做一个简单的逻辑分析仪。为了简单起见,本次没有采用out-of-tree的开发方式,而是将代码放在了app文件夹内。

SUMP与SIGROK

  • sigrok
    • 这是一个支持大量设备的开源逻辑分析仪程序(也支持示波器、电源等设备)。
  • SUMP
    • SUMP是一个基于串口(UART/USBCDC)的逻辑分析仪传输协议。

基于这两个工具,我们实现逻辑分析仪的技术准备就基本完成了。

开发APP

为了获得更高的采样速度,需要在APP层级重新定义端口驱动,以绕开zephyr的IO驱动,较少操作系统抽象造成的性能损失。

  • sample文件夹下有大量例子,可以简单的复制出来,作为我们开发的基础。
  • APP KCONFIG设置
    • 对于app级别的宏进行描述,这些宏可以根据实际使用的目标平台进行调整。例如:采样频率,采样数据长度等。
  • 板级设备树覆写
    • 对于逻辑分析仪来说,为了更快的采样速度,我们需要更快的GPIO驱动,而zephyr提供的接口由于抽象,会损失些许性能。
  • app层驱动
    • 这里是对于不同芯片的端口驱动。不同芯片根据资源不同,可能会提供不同数量的端口数和采样方法。例如:
      • Zephyr GPIO方法
      • 汇编方法(目前只实现了ARM)
      • Timer + DMA方法(目前没有做)
  • app
    • 启动了一个测试用pwm(绿灯)
    • SUMP协议的处理
  • 文档
    • 一些文档更加利于别人理解这个项目的用途
  • todos
    • 这个app是我头脑一热做的,还有很多不完善的地方,暂时记录在这里

图片

开发板照片

PulseView采样

IAR ARM 9.30 破解

由于突如其来的疫情,被迫在宅工作。

匆忙中从公司拿了IAR的功能安全版本的加密狗回家,但是有的同事拿的是普通版本的IAR,为了确保大家环境都OK,所以只能无奈破解下以便确认工程正常。简单来说,和之前破解IAR CCRH的逻辑类似。

只记录破解方法,不提供破解结果。

使用雷锋破解器激活

这一步直接跳过吧,遍地都能搜索到。

然后新建工程,编译得到错误:The generation feature is not of version 18.

                 
  test - Debug
  Reading project nodes...
 
  main.c
  Fatal Error[LMS001]: License check failed. Use the IAR License Manager to resolve the problem.
  The generation feature is not of version 18.
 
  Total number of errors: 1
  Total number of warnings: 0
 
  Build failed
 ​

使用IDA打开iccarm.exe

  • strings窗口搜索The generation feature is not of version 18
  • 双击进入反汇编
  • X跳转至调用处

修改jgejl

  • 保存exe,重新编译,写个小错误也被成功识别

License窗口和调试

之前在RH850编译器破解时候有修改LicenseInfo.exerh850sim.dll

估计IAR ARM也是一样逻辑,不过这两个模块我暂时用不到,能试着编译成功就行了。