页次: 1
在UNICODE文本流前面加BOM是符合UNICODE标准的,为什么符合标准仍然会被一些人指责呢?指责方无非是为了己方利益而已,说白了就是争夺话语权(加BOM还是不加BOM的事实话语权)。
从技术上看加BOM能够指示读取程序快速解码,有利于提高用户体验,用户更喜欢。不加BOM也无大碍,无非是解码时需要逐个尝试UTF8/UTF16-LE/UTF16-BE/ANSI CODEPAGE等编码方式,耗费的时间多一点而已,从这一点看加BOM是比较聪明的做法(懒的人一般更聪明😝)。
我们知道XML文件有“encoding”,HTML文件有“charset”指示符,说明了客观上是有指示读取程序如何解码的需求,在UNICODE文本流前面加入BOM是能够给与一般文本文件读取程序一定的帮助又符合UNICODE标准的做法。
不管哪个系统的文本文件读取软件都应该能够识别开头的BOM,可以不加BOM但不应该不能识别BOM,这是为了提高用户体验而不是为了程序员自身的固执偏见
BOM不仅用来指示大小端还用来指示文本编码。开发过文本编辑器的都有体会,如果文本文件的开头没有BOM那么就只能靠猜,当然UTF8编码总是能够猜对的,因为它有自编码规则,但是ANSI CODEPAGE和UTF16就不是那么好猜了。编辑器每次都靠从头猜到尾来判断文本编码对效率来说也不好,假如编译器每打开一个源文件就要猜一次,那编译一个大工程也是够累的,当然有些编译器不愿意去猜,只承认ANSI编码。
顺便提一下,KEIL这个IDE以前是支持BOM的,到了5.x后好像取消了对BOM的支持,这样一来用户就变得不方便了。其实检测文件头的BOM只不过是几行代码的事情,我实在想不明白为什么他们不愿意支持这个功能。Win平台上的文本编辑工具绝大多数会支持BOM,连最简单的记事本都能够支持BOM,这才是以用户为中心的做法。
如果T113跑AWTK的帧率达不到60fps,有可能是我之前就已经反馈的 `awtk-linux-fb`源码上的强制等待垂直同步信号导致的:
https://github.com/zlgopen/awtk-linux-fb/issues/88
双缓冲仍然要等待垂直刷新同步的,只是GUI渲染好一帧以后不应该呆呆的等待垂直刷新中断的到来,应该把渲染好的FB放入队列,在垂直刷新中断里面更换屏幕FB地址。
首先说几句题外话,linux内核经过行业测试没错,但是也不能排除设备驱动程序写得蹩脚,宏内核的linux系统一样会崩掉。常用的RTOS获得各种安全认证,比如国产的RTT就获得了ISO 26262 ASIL D、IEC 61508 SIL 3、EN 50128 SIL 4几项安全认证,已经发射上天了。
回到正题,我明白你的意思是MMU可以隔离进程,即使进程崩掉也不会导致系统宕机。这个其实只是理想情况,质量差劲的APP也会吞噬系统资源,让系统处于不死也不活的状态。对于APP崩溃了不影响系统安全的说法,那我还可以说RTOS养条狗还可以无限复活呢。
系统的稳定性跟很多因素有关,很难简单去辩证,复杂的系统也可以很稳定,简单的系统也可能很差劲。
但是从工程管理的角度看,RTOS因为具有代码规模比较小的优势,可控性更强,代码质量更容易管理,所以RTOS的可靠性一般更高。
今日特意测试了一下这份代码,把它移植到了VC++上面跑了一下。
代码大致没有什么问题,但是建议考虑一下不同编译器之间的兼容性。
移植到VC上时为了方便把库代码改成了CPP后缀,并且改动了一些地方。
1、改成CPP是因为函数内变量声明位置比较随意,标准C不通过。
2、cg_array_ensure由宏改成了模板函数,因为VC++里面malloc需要强制转换。
3、min/max宏改了。
4、SW_FT_MSB用VC++的intrinsic改写了。
5、库代码当中所有malloc的地方加了强制类型转换。
@novice
具体哪方面不够看呢?
我手中的这份LVGL是8.1版本,这是它的硬件抽象层,可以看到它并没有对硬件加速很感兴趣,主要还是依赖软件来执行。
真正专业的HAL应该能够利用硬件矩形填充(包括阿尔法填充)、硬件BLT操作(包括blend),硬件像素格式转换(RGB565/ARGB888/YUV422等)、硬件2x2矩阵操作(旋转、缩放、平移、剪切等)、硬件光标等。如果硬件不支持那就用软件完成。
但是这些东西可能会提高驱动移植的难度,而且也提高了对资源的需求,所以LVGL优先选择了小巧的方向。LVGL还有一些分散的代码利用STM32/NXP的硬件加速,不过很不规范,所以我猜想他们会继续改版。
LVGL不支持这些东西不是它的错,它的定位是小资源硬件平台。1080P这种高分辨率场合还是不要为难它了,毕竟MPU不仅仅要做GUI绘制还要处理其它事务,Fill/Blend/BitBlt这些繁重的任务最好还是硬件来完成。
/**
* Display Driver structure to be registered by HAL.
* Only its pointer will be saved in `lv_disp_t` so it should be declared as
* `static lv_disp_drv_t my_drv` or allocated dynamically.
*/
typedef struct _lv_disp_drv_t {
lv_coord_t hor_res; /**< Horizontal resolution.*/
lv_coord_t ver_res; /**< Vertical resolution.*/
/** Pointer to a buffer initialized with `lv_disp_draw_buf_init()`.
* LVGL will use this buffer(s) to draw the screens contents*/
lv_disp_draw_buf_t * draw_buf;
uint32_t full_refresh : 1; /**< 1: Always make the whole screen redrawn*/
uint32_t sw_rotate : 1; /**< 1: use software rotation (slower)*/
uint32_t antialiasing : 1; /**< 1: anti-aliasing is enabled on this display.*/
uint32_t rotated : 2; /**< 1: turn the display by 90 degree. @warning Does not update coordinates for you!*/
uint32_t screen_transp : 1; /**Handle if the screen doesn't have a solid (opa == LV_OPA_COVER) background.
* Use only if required because it's slower.*/
uint32_t dpi : 10; /** DPI (dot per inch) of the display. Default value is `LV_DPI_DEF`.*/
/** MANDATORY: Write the internal buffer (draw_buf) to the display. 'lv_disp_flush_ready()' has to be
* called when finished*/
void (*flush_cb)(struct _lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
/** OPTIONAL: Extend the invalidated areas to match with the display drivers requirements
* E.g. round `y` to, 8, 16 ..) on a monochrome display*/
void (*rounder_cb)(struct _lv_disp_drv_t * disp_drv, lv_area_t * area);
/** OPTIONAL: Set a pixel in a buffer according to the special requirements of the display
* Can be used for color format not supported in LittelvGL. E.g. 2 bit -> 4 gray scales
* @note Much slower then drawing with supported color formats.*/
void (*set_px_cb)(struct _lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa);
/** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the
* number of flushed pixels*/
void (*monitor_cb)(struct _lv_disp_drv_t * disp_drv, uint32_t time, uint32_t px);
/** OPTIONAL: Called periodically while lvgl waits for operation to be completed.
* For example flushing or GPU
* User can execute very simple tasks here or yield the task*/
void (*wait_cb)(struct _lv_disp_drv_t * disp_drv);
/** OPTIONAL: Called when lvgl needs any CPU cache that affects rendering to be cleaned*/
void (*clean_dcache_cb)(struct _lv_disp_drv_t * disp_drv);
/** OPTIONAL: called to wait while the gpu is working*/
void (*gpu_wait_cb)(struct _lv_disp_drv_t * disp_drv);
/** OPTIONAL: called when driver parameters are updated */
void (*drv_update_cb)(struct _lv_disp_drv_t * disp_drv);
/** OPTIONAL: Fill a memory with a color (GPU only)*/
void (*gpu_fill_cb)(struct _lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width,
const lv_area_t * fill_area, lv_color_t color);
/** On CHROMA_KEYED images this color will be transparent.
* `LV_COLOR_CHROMA_KEY` by default. (lv_conf.h)*/
lv_color_t color_chroma_key;
#if LV_USE_USER_DATA
void * user_data; /**< Custom display driver user data*/
#endif
} lv_disp_drv_t;
novice 说:解压出错啊,楼主快赔钱!
https://whycan.com/files/members/1850/捕获.jpg用7z试一试?
解压 xfel_msvc2017_project_20210615b.7z 正常
晕哥能不能压成RAR发上来?ZIP更好啊?
bellard的riscv&x86模拟器
https://bellard.org/tinyemu/
下了,1M大小,支持X86和RISC-V,还可以json配置。不错,正在学习。
文档来了。
不过新唐的裸机SDK代码很烂的,NVTFAT没有源代码而且还跟Nand Flash/SPI Flash/SD等驱动耦合得很严重,总之就是烂。
页次: 1