@海石生风
“zig这个编译时特性在众多编程言语中是绝无仅有的” 这个特性确实是非常适合搞声明UI的,你这个选择非常正确。
看来你走的路线是利用binding来更新属性而不是对vdom进行diff再更新
我个人更喜欢reactjs这种vdom diff的方式,不用显式声明属性绑定,每次model变化,把整个UI 的builder重新运行一遍,再根据vdom实例化组件
坏处是开销大了不少;好处是可以任意方式写UI,每一帧的UI都可以是完全和上一帧不一样,是动态决定的。比如
if (fail_happen)
Text(‘error is {erro_code}')
else
Button(text=stat?'Yes':'No')
end
binding除了写起来有点繁琐以外,如果model值不能直接用于UI显示的话,还需要写转化函数。比如:
erro_code -> ‘error is {erro_code}'
stat -> stat?'Yes':'No'
以前玩微软XAML写UI就把我烦死了,写个binding还得写个converter
刚刚看到一个磨损均衡的库:https://github.com/azure-rtos/levelx
所以说,,磨损均衡还是挺复杂的,,
嵌入式Linux直接用spi nand默认有磨损均衡吗?
有已经配好的固件吗?在主页没看到下载地方
@海石生风
有些逻辑是UI相关的逻辑,如果描述语言无法实现描述的动态性和逻辑,实际反而不方便。以前我也觉得逻辑是逻辑,UI是UI,必须分开。但是看过ReactJS之后我又动摇了,现在流行的是业务逻辑-》数据-》UI逻辑和状态-》View这样的单向数据流,反而不提倡UI和逻辑放的太开。
高级语言当然有用,可以实现UI和逻辑的无缝组合,多位一体,不用创造和学习一个特定的描述语言;既可以写逻辑也可以写UI,想分开就分开,想合在一起就合在一起,想组合就组合,灵活多变,表达能力强。
AWTK这种有点像Vue,创造了很多扩展语法到XML,要想写UI和逻辑,你得在XML,扩展语法,C或者JS三者之间跳转
QML这种,你得在QML,JS,C++三者中跳转
ReactJS这种,你只需要JS语法和一点点XML的组织形式(其实也只是可选项)。比如Flutter,语言本身就可以实现类似XML的嵌套结构和可变参数,所以它只需要一个语言。
因芯片本身没加密,所以至少SPL那阶段是不加密的。
你可以程序起来后,根据ID自己算一份,然后自己把自己给更新了。
顶楼上,烧的时候可以烧一个bin,启动的时候读了SPI flash的ID后自己改flash某个地方,实现绑定ID
我用Python也做了个声明式框架,一直没有完工,这是初步效果:支持class组件和stateless函数组件
class AgeComponent(Component):
def render(self):
return Text(text = f"I\'m {self.props['year']} years old")
# stateless functional component
def AgeFunctionComponent(age):
if age < 15:
return <AgeComponent year=10 />
else:
return <Text text=" I'm Adult" />
class MyApp(Component):
age = State(9)
@thread
def add_age(self):
for i in range(100):
self.age += 1
print(f'age:{self.age}')
# time.sleep(0.01)
def render(self):
return (
<App>
{<Text text=" I'm Child" visible = {self.age > 15}/> if self.age < 18 else <Text text=" I'm Adult" />}
<Text text=" ---------------------------- " />
<AgeFunctionComponent age = {self.age} />
<AgeComponent year={self.age + 1} />
<Button text = 'Press Me' on_press = {self.add_age}/>
</App>
)
render(<MyApp/>)
达克罗德大佬:这个示例能给mangopi r3用吗?我已经刷好了,但是在UART0上接上串口转接卡,无法看到输出字符“A”。
https://gd4.alicdn.com/imgextra/i4/479269519/O1CN01GTb4S02KBkpY6rcjS_!!479269519.jpg_400x400.jpg
应该能用的,你接的是UART0 是GPIOE1 and GPIOE0吗?
多层毛玻璃,一层是progress bar控件被贴了个毛玻璃,另一个glass窗体贴了个毛玻璃。
https://whycan.com/files/members/2137/6_20210630-1054.mp4
效果不错!不过我看到帧率有明显降低
移植8.0到 STM32H750会进入HardFault_Handler, 在lv_refr.c的138行出问题,具体原因没找到
https://whycan.com/files/members/2275/微信截图_20210622112255.png
有没有哪位大佬比较熟悉,看是啥原因,
移植driver没写好吧,看截图好像和LCD驱动有关
达克罗德 说:我记得,要在kernel打开sunxi的DRM和panel驱动,没有DRM驱动,GPU是不会生成节点的
搞定了,非常感谢“达克罗德”的帮助!
犯了个低级错误。缺少了 CONFIG_DRM_PANEL_SIMPLE=y
要选上这个就必须先选上以下这两个才行:
Graphics support --->
Backlight & LCD device support ---
<*> Lowlevel Backlight controls
要选上才能选下面的
Display Panels --->
<*> support for simple panels是这个吗?
是这个!
声明式ui,还是流行的web前端比较合适(html,css,js三剑客)。sciter就是基于这种技术实现,体积也比较小,不过需要linux(gtk)。
https://whycan.com/files/members/1315/Screenshot211109.png
sciter不是完整实现,React和VUE都跑不起来的。
不过作为一个HTML引擎,sciter确实很小巧才几个MB。我也关注很久了,学生时代就关注过,那时候它还很简陋,现在强大多了
不用神话声明式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的启发慢慢发展和流行出来的吧。
你对声明式UI理解有误,你说的是声明式创建控件,但是其实声明式UI直接创建的不是控件而是一个类似json结构的VDOM。然后才根据VDOM去创建或者更新真正的DOM控件。否则光有声明式创建,无法实现变量绑定和按需更新
我也是自己做了个React的Python版才真正理解了这点
不知道xui怎么解决多余重绘问题的,譬如某个控件的状态变化了,整个画面需要重画。在保留模式下因为修改控件的状态必须调用控件接口,所以控件的状态都由自己记录,控件可以知道自己状态有没有改变,没有就不需要重画。
某个控件状态改变导致整个画面重绘的问题很耗cpu,在嵌入式里面恐怕难以接受。
可以学学react的做法,控件函数里面只记录状态,控件api调用完成时(譬如xui_end_window()或xui_end()时)把整个ui树的状态发送到另一个线程做界面绘制。因为绘制线程拿到整个ui树各个控件的状态,这还可以在绘制前做优化。也可以在性能不足的时候把某些帧跳过,只需要忽略掉某次主线程发过来的状态。
XUI是绘图命令级别的脏矩形刷新,不是控件级别的局部刷新
嗯? 怎么理解呢,意思是,双缓冲下,在硬件disp控制器读帧过程中顿一下么, vsync机制是当前帧被使用的时候不会被填充么
达克罗德 说:光双缓冲,没有vsync处理,应该还是有小概率产生撕裂吧
就怕切缓冲buff地址时候,如果发生在读帧过程中,一样会导致画面撕裂。感觉和硬件设计和驱动程序有关,也许某些SOC硬件可以保证直接切换地址不会导致问题。
不过我看许多SOC都还是明确要求在帧中断去切缓冲。
DRM的文档有关于这个双缓冲和VSync的说明:
https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset-double-buffered.c
https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset-vsync.c
If you run this example, you will notice that there is almost no flickering,
* anymore. The buffers are now swapped as a whole so each new frame shows
* always the whole new image. If you look carefully, you will notice that the
* modeset.c example showed many screen corruptions during redraw-cycles.
*
* However, this example is still not perfect. Imagine the display-controller is
* currently scanning out a new image and we call drmModeSetCrtc()
* simultaneously. It will then have the same effect as if we used a single
* buffer and we get some tearing. But, the chance that this happens is a lot
* less likely as with a single-buffer. This is because there is a long period
* between each frame called vertical-blank where the display-controller does
* not perform a scanout. If we swap the buffers in this period, we have the
* guarantee that there will be no tearing. See the modeset-vsync.c example if
* you want to know how you can guarantee that the swap takes place at a
* vertical-sync.
根据这个理解,即使硬件支持任意切缓冲不会导致画面撕裂,也还是会有问题。当绘图刷新率不稳定的时候,有可能会导致掉帧现象。你可以想象在一帧的时间里,如果不在v-blank时间来切缓冲,有可能刚好错过当前这一帧的数据。所以PC游戏里一般有个选项,锁定帧刷新到显卡vsync
达克罗德 说:暗装,虚拟机,片外加密芯片
单片机里面如何跑虚拟机?兄台能否指点下?
达克罗德 说:转自另一帖:
启动时PLL_VIDEO时钟只有198MHZ,而全志要求和pixel时钟的倍数必须大于等于4,实际我发现大于等于6才行。所以33Mhz以上TCON时钟工作不正常
需要把PLL video时钟设高一点
把sys_clock.c中
write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004107);
时钟输出=24000000*(0x41+1)/(0x07+1)=198Mhz
改为
write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004103);
时钟输出=24000000*(0x41+1)/(0x03+1)=396Mhz
这时候pixel_clock_hz能设置成更高时钟了
您这个改的是uboot的还是内核啊
裸机
原来-l需要放到object之后
有个文章专门解释了这个问题
https://stackoverflow.com/a/43305704/388520
结贴
编译一个APP时,链接出错:
/usr/bin/ld: out/obj/keyboard.o: in function `keyboard_state_get_plain_codepoint':
/mnt/flutter/src/keyboard.c:365: undefined reference to `xkb_state_key_get_utf32'
我的链接命令:
cc -I./include -I/usr/include/libdrm -DBUILD_TEXT_INPUT_PLUGIN -DBUILD_TEST_PLUGIN -O0 -ggdb -lgbm -ldrm -lGLESv2 -lEGL -lsystemd -linput -ludev -lxkbcommon -lrt -lpthread -ldl -lm -L/usr/lib/arm-linux-gnueabihf
明明libxkbcommon.so里有这个函数:
nm -D /usr/lib/arm-linux-gnueabihf/libxkbcommon.so
...
00014c5c T xkb_state_key_get_utf32@@V_0.5.0
..
而且不光是这个函数,所有动态链接的函数都找不到。
我是在qemu-user-static模式下编译的,不知道和这个有关吗
https://whycan.com/files/members/5025/QQ图片20201024082850.jpg
modetest -M sun4i-drm -P 31@47:480x272+10+10 -P 35@47:480x272+100+100 -P 39@47:480x272+150+150 -P 43@47:320x240+200+200
在 @HackforFun 大佬帮助下, 终于初步搞定四层测试
请问drm实现的是硬件4层还是软件4层?
感谢!资料蛮丰富