1. OSTaskCreate 的参数中有一个 void *p_ext,这个参数用来传递额外的信息,可以用来传递数组,结构体等等。

  2. AppTaskStart --> CPU_Init --> CPU_TS_Init --> CPU_TS_TmrInit --> BSP_CPU_ClkFreq() 这个函数是需要用户自己实现的,是MCU的主频。 对于STM32而言,返回的是 HCLK_Frequency。

  3. mutex 和 sem 的区别是高优先级任务在等待信号量时的表现。比如说低优先级任务已经申请到了打印机的信号量,正在打印的时候,高优先级任务也要使用打印机,开始申请信号量,如果是 mutex,那么高优先级任务的打印数据会插入到低优先级的打印数据中,造成打印混乱的现象,如果是 sem,那么高优先级任务会等待低优先级任务打印完成并释放信号量后,才能开始打印。

最近在网上看到一些资料图片比较好,想要下载下来,结果该网页禁止右键。这难不倒我们,直接使用 更多工具 --> 开发者工具,就可以看到网页源码了,然后在里面慢慢找到图片对应的描述行。 但是蛋疼的事情发生了,就算找到描述图片的那一行,你复制图片地址进行下载或者在新的网页打开,都是显示不出来图片,提示禁止外链图片。 经过一番网上查找,终于找到办法了,只要把浏览器拉小,然后打开一个文件夹,然后右键源代码中图片的那一行,选择 reveal in sources panel,这时候就能看到图片了,然后直接把这个图片拉到文件夹里面即可,拉下来的文件自动命名为 download,需要手动改名。

  1. 按键和 IO 之间连接一个 1K 电阻,可以防止当 IO 被配置为高电平输出的时候,按下按键,导致 VDD 和 GND 直接连通。

stm32h7xx_hal_conf.h 中需要注意的几个地方:

  1. HSE_VALUE 这个外接晶振的频率

  2. TICK_INT_PRIORITY 这个 tick 的中断优先级,因为 HAL_DELAY 这个函数是基于这个 tick 的中断的,所以如果有其他高优先级的中断中调用了 HAL_DELAY 函数,会造成 tick 的中断一直进不来。这样的话 HAL_DELAY 也会一直卡住,这个高优先级的中断也会一直卡在这里。

  3. 断言的参考实现函数。

    /* 
    ********************************************************************************************************* 
    *  函 数 名: assert_failed 
    *  形    参:file : 源代码文件名称。关键字__FILE__表示源代码文件名。 
    *        line :代码行号。关键字 __LINE__ 表示源代码行号 
    *  返 回 值: 无 
    ********************************************************************************************************* 
    */ 
    void assert_failed(uint8_t* file, uint32_t line) 
    {  
    /*  
    用户可以添加自己的代码报告源代码文件名和代码行号,比如将错误文件和行号打印到串口 
    printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 
    */ 
    
    /* 这是一个死循环,断言失败时程序会在此处死机,以便于用户查错 */ 
    while (1) 
    { 
    } 
    } 
  4. HAL 库不像之前的标准库,在系统启动函数 SystemInit 里面做了 RCC 初始化,HAL 库是没有做的,所以进入到 main 函数后,系统还在用内部高速时钟 HSI,对于 H7 来说,HSI 主频是 64MHz。

  5. HAL_MspInit 和 HAL_MspDeInit 在 stm32h7xx_hal_msp.c 里面做具体实现。

  6. PA0_C 这类的引脚只有在 TFBGA240+25 ballout 这种封装上面才有。

  7. LSE Bypass 和 LSE On 之间的切换,必须要先关闭 LSE 才行。同样 HSE Bypass 和 HSE On 之间的切换,也必须先关闭 HSE 才行。

  8. HAL_RCC_OscConfig 会更新全局变量 SystemCoreClock 的主频值,并且会再次调用函数 HAL_InitTick 更新系统滴答时钟。

使用 segger 的 hard fault 的源文件后,当调试时,发生硬件错误的时候,可以查看 HardFaultRegs 中的内容,并对比 segger_HardFaultHandler.c 中的定义,就能得出具体是哪种错误了。

#define EventStopA(slot)           EventRecord2 (0xEF20U+EventLevelError+((slot) & 0xFU), ((uint32_t) __FILE__), __LINE__)

从这个宏定义可以看出,MDK是通过分析EventRecord2函数的 ID 数值来识别是否是 EventStop 之类的功能的,如果是这些功能,那就把后面的数值转化为相应的文件和行号,并可以进行相应的定位。

gentoo 上面修改键盘映射分为两种,一种是终端环境,一种是X环境。

终端环境

https://www.emacswiki.org/emacs/MovingTheCtrlKey https://wiki.gentoo.org/wiki/Keyboard_layout_switching 参考里面的终端部分,从 /usr/share/keymaps/i386/qwerty/ 这个文件夹里面复制 us.map,解压 gunzip .map 然后修改里面的 control 对应的码, 然后另存为 us_ptz.map,并进行压缩,gzip .map 然后放到 /usr/share/keymaps/i386/qwerty/ 这个文件夹下面。

然后修改 /etc/conf.d/keymaps 这个文件,选择修改好的文件, 然后重启keymap, rc-service keymaps restart

按键可以通过 showkey 来获得对应的键值。

X环境

https://wiki.gentoo.org/wiki/Keyboard_layout_switching https://www.charvolant.org/doug/xkb/html/index.html http://blog.csdn.net/kl28978113/article/details/47955275

使用 setxkbmap 来管理X环境键盘布局 /etc/X11/Sessions/Xsession 这个文件可以看出使用 setxkbmap来对于 键盘布局进行管理。

setxkbmap -print -verbose 10 查看当前的 keymap

/usr/share/X11/xkb/keycodes/evdev 考虑了一下,最后直接修改 keycode里面的 evdev 文件,把里面的 caps和 RCTL替换,RTN和LCTL替换。

最近 gentoo 从 17.0 更新到 17.1, 需要手动进行升级配置,使用 unsymlink-lib -p --finish 这一步的时候报错,报错如下:

/usr/lib/python-exec/python3.6/unsymlink-lib -p --finish 

... 
rm -d /usr/lib64/go/test/fixedbugs/issue5957.dir/c.go 
rm -d /usr/lib64/go/test/fixedbugs/issue5957.dir/b.go 
rm -d /usr/lib64/go/test/fixedbugs/issue5957.dir/a.go 
rm -d /usr/lib64/go/test/fixedbugs/bug437.dir/one.go 
rm -d /usr/lib64/go/test/fixedbugs/bug437.dir/x.go 
rm -d /usr/lib64/go/test/fixedbugs/bug437.dir/two.go 
Traceback (most recent call last): 
  File "/usr/lib/python-exec/python3.6/unsymlink-lib", line 819, in <module> 
    main() 
  File "/usr/lib/python-exec/python3.6/unsymlink-lib", line 782, in main 
    m.finish(pretend=args.pretend, resume=args.action.endswith('resume')) 
  File "/usr/lib/python-exec/python3.6/unsymlink-lib", line 585, in finish 
    out('rm -d {}', fp) 
  File "/usr/lib/python-exec/python3.6/unsymlink-lib", line 41, in out 
    _log(template, *args, **kwargs) 
  File "/usr/lib/python-exec/python3.6/unsymlink-lib", line 30, in _log 
    **kwargs 
UnicodeEncodeError: 'ascii' codec can't encode character '\xc4' in position 50: ordinal not in range(128) 

我的 unsymlink-lib 的版本是 15,前面的一些 bug 已经修复了,所以检查 locale 的结果,结果发现是 locale 的问题, locale 都是 "POSIX",通过修改 /etc/env.d/02locale,

LANG="en_US.UTF-8" 
LC_COLLATE="C" 

然后 env-update && source /etc/profile,就解决问题了。

最近有些资料需要在电脑和nas之间进行同步,考虑到这些资料很多不是文本字符,也不需要进行版本控制,所以考虑只需要文件夹同步工具即可。 通过搜索,最终选定了 freefilesync 这个软件,直接选择两个文件夹,然后先进行比较,比较可以选择比较时间和大小,或者只比较大小,比较完了以后,可以选择同步即可。