CPU:8核或以上,64位带MMU,8GB+ DRAM,需要配套的IO芯片,跑linux发行版或windows等全功能操作系统,例子:桌面CPU
APU:4-8核,64位带MMU,1G-16GB DRAM,跑linux发行版或android,例子:手机主控AP
MPU:单核/双核,32位/64位使用N32 ABI,带MMU,32M-1GB DRAM,跑嵌入式linux或rtos,例子:边缘网关主控
MCU:单核,32位 无MMU有MPU,64K-1MB SRAM,跑rtos或裸机程序,例子:电机控制芯片
更小的MCU:单核,8/16位,无MMU无MPU,4k-64k SRAM,跑裸机程序,例子:家电控制芯片
soc主要指MPU和APU两者
@海石生风
你是AWTK开发人员吗?我一直觉得用zig实现gtk/glib那样规模和完善度的库是一个很好的证明自己的机会。当然gtk/glib有点大,能用zig实现AWTK也是很好的证明,有人推动一下就好了。
对于rust,从热度和复杂性来说我感觉有成为第二个c++的趋势。我比较同意这篇文章里面的说法,rust的做法有点迂腐了,减少了编程的乐趣。linux 6.1要集成rust支持了,我很想看看几年后just for fun的linus会怎么看待rust。
对于c++的继任者,我感觉google的carbon有可能更受欢迎。carbon对c++的兼容跟zig对c的兼容一样好。rust意味着重学重写,carbon和zig意味着学多一点。
还有一个,用zig在risc-v mcu上做裸机开发:https://github.com/nmeum/zig-riscv-embedded
rust跟C的设计思想可以说是两个极端,rust调用C虽说可行,但非常吃力。我曾想用rust调用C的UI库来进行图形开发,发现对接非常困难,可能是我的功力不够,只好做罢。
并且rust开始走C++的老路,特性非常多,代码阅读起来吃力。而C因为特性太过简单,很多人会用大量的指针来模拟面向对象,导致阅读调试也很吃力。
所以现在嵌入式领域缺少像golang那样简洁而又高级的语言。
@海石生风
zig和c/c++的互操作性很佳,你甚至可以拿zig做c/c++编译器。
可以试试zig,像这位一样:Build an LVGL Touchscreen App with Zig
年头跟各位讨论了rust和zig语言各自的特点和应用领域,特别是我们都关注的嵌入式领域。
现在快到年尾了,最近发现了一个网站,报道zig语言的发展和在不同领域的应用:https://zig.news
从这个网站看到国外已经有人认真的把zig用在MCU开发了,譬如这个新加坡人做的一些项目https://zig.news/lupyuen
另外,游戏开发、WASM也是两个较多人探索的方向。联想到前段时间一夜爆红的Bun.js,以及前段时间报道过的因为zig对c/c++兼容性太好,uber拿zig做c/c++交叉编译器的新闻。看来zig确实解决了一些c/c++开发人员的痛点,是一个可以跟进的编程语言。
至于rust,年底发布的linux 6.1就能用rust写内核代码了,我也要去学学了,不然饭碗不保。虽然要冲rust,但希望在不久的将来能看到zig写的rtos。附送两个有用链接:
https://microzig.tech
https://github.com/ZigEmbeddedGroup
手动管理内存的语言在实时性上面超越GC管理内存的语言,主要是把内存释放工作化整为零,分散在执行路径各处了。大家都是手动管理内存,在实时性这方面zig不会比rust差。
可靠性zig要靠静态分析动态分析多做测试等工程上的努力去提高,这些工作做c/c++的人都很熟悉了。当然zig在这些工作上还是比c/c++方便些,而且也在语言层面做了一些保障,譬如有空安全语法,带有测试语法,可选数组越界判断,提供可跟踪的内存分配器等等。相当于把一些c/c++提高代码质量的最佳实践都提供了,只要你对代码质量有要求,是可以通过这些工具和语法去达成的。
rust说的安全其实也不是万灵神药,内存泄露是可能的,数组越界也是可能的,除0出错这些也没法处理的。当然这些都算代码逻辑错误,我的意思是rust解决了一些问题,但还是有它解决不了需要程序员以及工程方法去保证的问题。我觉得不要神话rust,特别是不要在嵌入式领域神话rust。
是选择zig这种语法熟悉灵活,但工程工作多些的语言,还是选择rust这种语法束缚多,工程工作少些的语言,还是继续c/c++到底,很考验cto们的智慧了。
跟rust把内存管理规则置于语言层面不同,zig选择跟c一样让程序员自己自由管理内存,但又提供了便利的手段去调试内存错误。就是说跟用c一样,你也可以写出有内存bug的代码,但如果你想要高质量的代码,比用c容易。zig用工程上的改进达到内存安全。
当然zig也提供了其它语言特性,譬如rust的option和result在zig都有对应的实现。go的defer zig也支持。泛型也有。没有class但支持struct内置方法。不妨把zig看成是路子正确的c ++语言吧。
zig设计的时候就考虑到了裸机开发,交叉编译、无运行时依赖一开始就有,而且可以选择生成快速的二进制或生成更紧凑的二进制,拿来做mcu开发挺合适的。
快速编码,方便解bug,这是zig做的权衡(trade off)。不妨说rust是学术的,zig是工程的实用导向的。事实上rust内存管理方式确实来自于十多年前编程语言领域的学术研究。但对于习惯了直接操作硬件的mcu工程师,rust这不行那不行,这里要那样,这样束手束脚的开发过程确实很挫败,特别是代码量不大操作指针不多内存方面出bug概率不多的程序,你会怀疑自己是不是捡了芝麻丢了西瓜。所以我很建议你们想用rust的不妨也看看zig会不会更适合自己。
改名字了:
https://slint-ui.com
感谢分享!看了下demo,感觉响应速度非常快,声明式编程还算方便,不过有个问题就是UI还不太漂亮,控件也不多;商业价格29900欧还挺贵的,必须每年都交钱
20万RMB一年,也就一个熟手rust程序员的普通工资水平,真不贵。
想想有哪些公司是需要高性能,低时延,高安全,又不能开源的app的,这些公司很可能是吃军工,航空航天,汽车行业饭的,利润之高根本不在乎这20万。
何况这20万不单单是买license还有技术支持。
普通民用消费市场,没必要非要上SixtyFPS,市面一堆c/c++的ui库,出原型又快,人还好招,消费产品出点bug可以接受。
rust的ui库较大范围替代c++ ui库,我想还有5到10年的路要走。现在可以上手,但不建议立马就用上。
SixtyFPS提供了一个简单的上手教程: https://sixtyfps.io/releases/0.1.5/docs/tutorial/rust/getting_started.html
不妨跟斯坦福的CS139课程做对比。斯坦福的CS139课程是教SwiftUI的,开始那几课是写一个记忆力游戏。SixtyFPS的这个上手教程也是写记忆力游戏,正好可以相互对比,看看使用不同的声明式UI库编写应用的差异。
我怀疑SixtyFPS的这个上手教程是故意选择写记忆力游戏这么一个例子,好让大家跟斯坦福的CS139课程内容做比较。当然罗,即使两边都看过后,我还是喜欢SwiftUI多点。
斯坦福的CS139课程可以在 youtube.com 免费观看,教学水平相当的高。每年一更,记得追新。
暂时使用的名字是SixtyFPS: https://sixtyfps.io
他们又搞了门很像qml的UI DSL,这个DSL可以用rust的宏系统在编译时转换成rust代码,然后通过rust编译器统一编译成二进制代码。这样的设计会得到比QtQuick更高的性能。
这个思路我在这里也说过,果然是很好的策略。
不过这样的设计也会引入双语言的问题,就是ui部分是一门语言,主逻辑部分又是另一门语言,虽然SixtyFPS的UI DSL跟rust相像,但不免还是要学习和同时使用两门语言。
对比flutter,jetpack compose,swiftui这三个主流的声明式UI框架,它们的UI和逻辑都是同一门语言。flutter对语言特性的要求是最少的,但看上去并不那么“声明式”;jetpack compose通过编译器插件做转换(如果理解不对请指出);swiftui在语言上加料,直接在编译器上增加swiftui所需特征支持。可以说都各有取舍,各有爽点和槽点,没有百分百完美。
跟qt使用GPL和商业授权这两种授权模式相比,SixtyFPS加多了一种名为“大使(Ambassador)”的授权,客户可以不交费同时不开源,但需要宣传SixtyFPS。这对中小微企业比较有吸引力,对SixtyFPS自然也有营销的价值。更高的性能、更安全的语言、更普适的授权,我觉得假以时日SixtyFPS很可能会取得比qt更大的发展。再加上SixtyFPS在欧洲工业中心德国,未来更可期。当然中间被qt收购也说不准。
SixtyFPS支持rust、c++、js作为主语言。rust学习有点难度,而且生态还处于拓荒阶段尚待成熟;c++容易出bug,想写稳定需要功夫;js性能慢,脚本语言也不适合写大程序,各有各难点。如果系统有gpu的还是优先选择flutter。高端ap用flutter,低端ap或mcu用SixtyFPS应该是比较实用的选择,特别是flutter刚开始就以支持gpu加速为设计目标,SixtyFPS则相反到现在对gpu加速支持并不完善。即使未来SixtyFPS对gpu加速支持完善了,但高端ap性能强,拿点性能出来支持GC,不用自己管理内存,其实也挺爽的。
放了一份到百度云盘
链接: https://pan.baidu.com/s/1xNVuTKCnAG8eswj4b2PFVQ 密码: fi4l
哪有300块的rv1126开发板?发个链接看看?
买了个firefly出的uvc模组,在玩。
rk平台他们自己的造的轮子太多了,什么rockx, rockface, rockit, rkmedia, easymedia。
linux自身有gstreamer,ffmpeg,opencv,本来搞几个plugin适配一下这些框架就好,非要自己造轮子。
用cortex-a cpu的soc不大可能上没什么框架的rtos,在linux上一大堆成熟框架重造轮子干嘛呢,带动码农就业率吗。
用了他们的平台又要重新学一遍了,关键不知道稳定性如何,又不开源,遇到bug只能等他们修。
测了一下他们提供的demo,只能说得在速度和识别率中取舍。
在这个芯片上跑自己的模型还没试,看他们提供的rknn-toolkit还挺完善的,而且一直在更新。不过从他们提供的成熟模型的效果来看,对其实用性还是有点保留。
看文档他们提供的模型是要收费的,自己训练耗时耗力效果怎样难以预测,都难。
angelsan 说:这个规格看起来真不错,单价大概多少?哪里能拿到资料
dianguai14 说:这个7-12美金。分3个版本。
能说说哪3个版本?
INT2和INT4在DNN用来做什么?
如果c语言支持命名参数和匿名函数,那可以写成flutter那样:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Center(child: Text('$val'))),
ElevatedButton(
child: Text('Add'),
onPressed: () => change(),
),
],
),
),
);
}
如果c语言进取一点,有更多的语法糖(https://developer.android.google.cn/jetpack/compose/kotlin),可以写成jetpack compose那样:
@Composable
fun NewsStory() {
Column(
modifier = Modifier.padding(16.dp)
) {
Image(
painter = painterResource(R.drawable.header),
contentDescription = null
)
Text("A day in Shark Fin Cove")
Text("Davenport, California")
Text("December 2018")
}
}
我了解了c语言的标准,即使是下一代标准c2x,仍然不支持这些语法,所以用c语言做声明式GUI还是不成。
有另一个法子,可以自己定义一套DSL,用编译器把DSL转换成c,然后统一通过gcc编译。作为参考,nim,vlang这些语言都可以直接编译成c,而且还是全功能语言不是DSL,DSL应该更简单。另外,vlang也有自己的声明式GUI。
不用神话声明式GUI,概略的看它跟立即式GUI很像,flutter的runApp()就是xui_loop(),它内部也是不断调用build()函数,build()函数不断调用里面的widget生成函数去实例化widget,就跟xui的应用不断调用xui_begin_xxx()一样。只不过由于flutter和jetpack compose的语言有一些便利的语法,写出来的代码看上去像声明一个个widget而不是创建一个个widget,其实内在是创建一个个widget。
如果是实现立即式GUI,用过程式编程语言就可以了;如果是实现保留式GUI,面向对象语言更合适;而要实现声明式GUI,更现代的语言才行。声明式GUI的流行可能是前端开发人员在不断采用现代化的语言的过程中受了立即式GUI的启发慢慢发展和流行出来的吧。
确实,立即模式GUI实现容易,使用方便,显示速度快,而且更像是业务代码的一个呈现层,并不是框架,这些优势确实很契合嵌入式系统。我想一个比较大的问题会是扩展性比较差,应用的功能一多,代码的规模和逻辑就有点难以控制。我想也是它的应用面不广的一个主要原因吧。保留模式GUI在应用设计时就要有分层思维,也容易模块化,更适合功能多规模大的应用。
声明式GUI说是兼有了立即模式GUI和保留模式GUI的优势,算是未来的趋势了。它们并没有使用脚本语言,swift、kotlin、dart都是编译型语言,只是它们的语法和编译器对声明式GUI做了些适配。脚本语言代码一多维护成本就很高,对app开发并不是好的选择。我记得qt在qt6也要把qml做成编译型的静态语言了。xboot支持lua,或许可以用lua做个声明式GUI。
jlau 说:不知道xui怎么解决多余重绘问题的,譬如某个控件的状态变化了,整个画面需要重画。在保留模式下因为修改控件的状态必须调用控件接口,所以控件的状态都由自己记录,控件可以知道自己状态有没有改变,没有就不需要重画。
某个控件状态改变导致整个画面重绘的问题很耗cpu,在嵌入式里面恐怕难以接受。
可以学学react的做法,控件函数里面只记录状态,控件api调用完成时(譬如xui_end_window()或xui_end()时)把整个ui树的状态发送到另一个线程做界面绘制。因为绘制线程拿到整个ui树各个控件的状态,这还可以在绘制前做优化。也可以在性能不足的时候把某些帧跳过,只需要忽略掉某次主线程发过来的状态。XUI是绘图命令级别的脏矩形刷新,不是控件级别的局部刷新
好像是,看了代码xui_draw_xxx()都是把绘图命令放入队列,在xui_end()做优化后绘图
不知道xui怎么解决多余重绘问题的,譬如某个控件的状态变化了,整个画面需要重画。在保留模式下因为修改控件的状态必须调用控件接口,所以控件的状态都由自己记录,控件可以知道自己状态有没有改变,没有就不需要重画。
某个控件状态改变导致整个画面重绘的问题很耗cpu,在嵌入式里面恐怕难以接受。
可以学学react的做法,控件函数里面只记录状态,控件api调用完成时(譬如xui_end_window()或xui_end()时)把整个ui树的状态发送到另一个线程做界面绘制。因为绘制线程拿到整个ui树各个控件的状态,这还可以在绘制前做优化。也可以在性能不足的时候把某些帧跳过,只需要忽略掉某次主线程发过来的状态。
如果要在程序中记住UI所有状态,这未免增加了应用开发人员的脑力负担,而且程序耦合度也高了。不过嵌入式系统ui不会很复杂元素也比较固定,这点额外负担倒是可以接受。
控件和变量天然绑定,我看了代码有些是,有些不是,譬如raido,progress,哪些应该绑定哪些不用绑定以后要好好设计。
我的第二个问题并不是通过描述文件生成ui,而是wpf中的mvvm,数据驱动ui。既然xui有数据绑定功能,那应该可以做到。
通过描述文件生成ui 看似解耦了ui和代码,其实在现实中ui和代码绝对分开的例子比例并不大,最后还是会增加ui设计者和代码开发者的沟通成本,如果都由一个人来做的话又要在ui语言和代码语言之间切换,这又增加了脑力成本,现在大家都准备走flutter和jetpack compose路线,也是吸取了多年经验教训后的结果啊。
其实曾经主控的LCD控制器一般也没这个功能,只是iphone出来后任意角度旋转开始流行,手机平板主控才开始加入这个功能。所以你看到全志跑android的主控都有旋转硬件,跑linux/rtos的都没有。
现在很多屏幕都是给手机平板提供的,基本都是竖屏,手机平板主控自然支持到位了。但很多嵌入式系统也想用这些屏幕,但又缺少旋转硬件,有时不得不放弃。
其实嵌入式系统只是想竖屏横用,并不需要在使用时可以任意角度旋转。现在的LCD驱动芯片都可以集成GRAM,也支持横屏取数,只需要集成2倍GRAM就可以实现竖屏横用,可以说把屏幕旋转功能加入到LCD驱动芯片是最经济对系统改动最少的做法。
当然把屏幕旋转功能加入到LCD驱动芯片也有一个缺点,就是显示延迟会增加16.6毫秒。主控集成旋转硬件可以做很快的,延迟相对小很多。
这不是LCD驱动芯片的锅。应该是RGB控制器的功能或者GPU要支持的功能。最近我也在纠结这个问题。tiky家的屏本质上是个竖屏,而全志RGB控制器似乎没看到有这种旋转功能
其实曾经主控的LCD控制器一般也没这个功能,只是iphone出来后任意角度旋转开始流行,手机平板主控才开始加入这个功能。所以你看到全志跑android的主控都有旋转硬件,跑linux/rtos的都没有。
现在很多屏幕都是给手机平板提供的,基本都是竖屏,手机平板主控自然支持到位了。但很多嵌入式系统也想用这些屏幕,但又缺少旋转硬件,有时不得不放弃。
其实嵌入式系统只是想竖屏横用,并不需要在使用时可以任意角度旋转。现在的LCD驱动芯片都可以集成GRAM,也支持横屏取数,只需要集成2倍GRAM就可以实现竖屏横用,可以说把屏幕旋转功能加入到LCD驱动芯片是最经济对系统改动最少的做法。
楼主,我编译了你的代码。可以通过烧录运行,但下载到内存执行失败。我用的下面的指令:
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000看@晕哥 的帖子 https://whycan.cn/t_449.html xboot是可以直接下载运行的,你这个是不能直接下载运行的吗?
找到方法了,新的下载运行命令变了:
sunxi-fel spl xboot.bin; sunxi-fel -p write 0x80000000 xboot.bin; sunxi-fel exec 0x80000000;
楼主,我编译了你的代码。可以通过烧录运行,但下载到内存执行失败。我用的下面的指令:
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000
看@晕哥 的帖子 https://whycan.cn/t_449.html xboot是可以直接下载运行的,你这个是不能直接下载运行的吗?
jlau 说:mango 说:是哈,同一个晶圆,个人觉得S3L比R11更舒服。该引的都引出来了。
似乎r7引出的脚更多,有ephy,dvp和lcd:
https://whycan.cn/files/members/955/allwinner_r7.jpg图里这个R7和V3S几乎完全一致,都是CSI-DVP和LCD没分开,R11分开了。
噢,说错了,r7是“有ephy,csi和lcd”。
看了一下v3s的datasheet,引脚功能确实跟r7几乎完全一致,估计就是同一个芯片打上不同的型号标签。
r11把dvp和lcd分开,那可玩性还是更高。
长期支持版本 https://www.kernel.org/category/releases.html
4.9支持到2023年1月
支持那么长,不错啊。
严肃的产品还是跟着LTSI走比较好
找到了这份文档,好多兼容的模块 https://amoghdesai.com/wp-content/uploads/2018/01/FY07024DI26A30-D_Compatible_LCD_panels.xlsx
买了块FY07024DI26A30-1,发现5V2A的充电器只能boot到一半就死机了
pine64官方屏幕用飞扬的FY07024DI26A30-D:http://files.pine64.org/doc/datasheet/pine64/FY07024DI26A30-D_feiyang_LCD_panel.pdf
淘宝只能找到FY07024DI26A30-1,不知有没有人尝试过?
https://github.com/blend2d/blend2d
有jit和simd加速,速度飞起: https://blend2d.com/performance.html
都是cpu运算,没有gpu加速,不知跟gpu加速比起来如何。
也不知跟google的skia比速度如何。如果也超越了,跟flutter一样在上面加个支持jit和aot的强类型语言,又一个牛逼的ui库啊。
c++标准几年前有建立标准图形库的提议,现在好像没再听说了
现在的嵌入式系统从内而外一般是 CPU -> SoC -> Board。
我的设想是,内核提供CPU级的支持,SoC厂家提供on-chip driver(这可以放在内核中),外设的驱动都交由开发板或者商业产品的开发团队自己去做。
产品开发人员根据自己选用的外设,如LCD面板、Camera Sensor、Ethernet PHY等编写对应的外设驱动,然后在应用启动时自己控制外设驱动的加载和on-chip驱动的加载,以及外设驱动和on-chip驱动的交互。
这么做的结果是可以提供一个统一、固定的平台给产品开发人员,产品开发人员不需要管内核的事,最多修改一下运行时配置文件,如GPIO分配。这可以降低系统和应用的耦合度,加快产品开发。
合宙 air720 系列
十刀?可以有。不知批量能到多少
Core Design可以定制自己的cpu核:https://www.sifive.com/core-designer
Chip Design可以定制自己的Soc:https://www.sifive.com/chip-designer
说是几个星期就能拿到样片,牛B了,开启芯片的软件开发模式
Qt for Application Development是根据商业和开源许可证双重许可的。商业Qt许可证授予您在不需要任何开源许可证义务的情况下以您自己的条件创建和分发软件的全部权利。凭借商业许可,您还可以访问官方Qt支持并与Qt公司建立密切的战略关系,以确保您的发展目标得以实现。
Qt for Application Development也可以在GPL和LGPLv3开源许可下使用。Qt工具和一些库仅在GPL下可用。有关详细信息,请参见对比图表 Qt开源许可非常适用于开源项目,如开源分发,学生/学术目的,业余爱好项目,没有外部分发的内部研究项目,或其他可以满足所有(L)GPL义务的项目。
商业授权价格不清楚,但是如果使用 LGPLv3 授权,可以不用公开项目源码.
LGPLv3不能使用Qt Charts和Qt Data Visualization,而且估计出货时还要为每台机器给钱的吧
jlau 说:达克罗德 说:但是rt1052为什么要两个地址寄存器,还说明了直接写current地址会导致flicker
那些没有两个地址寄存器的lcd controller也是有一个外部不可访问的内部寄存器的,在输出完当前帧的最后一行时会把用户可见的地址寄存器的值拷贝到内部的地址寄存器,然后开始读取framebuffer数据到内部fifo。在这个时间点之后配置地址寄存器只会在下一帧生效。
直接写current地址会导致flicker可能是把这个内部寄存器开放出来了吧,这样方便回读当前framebuffer地址。也有可能是指写current地址指向的framebuffer。嗯你说的有道理,非常感谢!另外人家是有切换中断的,所以支持类似显卡的60hz垂直同步功能,真正做到60hz同步显示不丢帧。而全志不支持这个功能,在fps=60hz时,其实有可能丢一两帧没有被显示。不过也没关系,真要到60hz估计人眼很难看出差异了
你要怀疑c100s只有一个地址寄存器的话可以使能vertical blanking interrupt,在中断来时修改地址寄存器。
根据lcd controller设计的不同,VBI来时修改地址寄存器也不一定来得及。因为framebuffer读取是DEBE来做的,通常DEBE内部都会有fifo来缓存几行framebuffer。DEBE设计为fifo输出完立马读取后续数据的话VBI来时修改地址寄存器就来不及了,可以用c100s的line trigger interrupt提前设置,但是SY0设置为多少合适又要不断尝试了。当然DEBE设计为tcon即将开始输出时再读取后续数据的话VBI来时修改地址寄存器就来得及了。
jlau 说:下一帧开始时生效,没人会做立即生效这么难实现又会出撕裂问题的控制器
但是rt1052为什么要两个地址寄存器,还说明了直接写current地址会导致flicker
那些没有两个地址寄存器的lcd controller也是有一个外部不可访问的内部寄存器的,在输出完当前帧的最后一行时会把用户可见的地址寄存器的值拷贝到内部的地址寄存器,然后开始读取framebuffer数据到内部fifo。在这个时间点之后配置地址寄存器只会在下一帧生效。
直接写current地址会导致flicker可能是把这个内部寄存器开放出来了吧,这样方便回读当前framebuffer地址。也有可能是指写current地址指向的framebuffer。