»
(008)CubeIDE实现USB外设*
(018)C99 的指针*
(019)C99 只有值赋值,没有move*
(022)POSIX线程库pthread的同步锁*
(023)POSIX线程库pthread的多线程*
(027)C99标准库中的计时与等待 *
(028)C语言中的高精度计算库GMP *
(029)C语言中的Web服务*
(030)C语言中的字符转码ICU*
(031)从几个方面显然C语言比C++效率高*
🕹️(001)while(1){}让出CPU后重进
当FreeRTOS中没有任务时,系统会执行空闲任务。FreeRTOS中默认的空闲任务叫做prvIdleTask。这个任务如果打开了宏configUSE_TICKLESS_IDLE,会让CPU进入睡眠模式(低功耗模式):portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime);。
在FreeRTOS中有一个configEXPECTED_IDLE_TIME_BEFORE_SLEEP配置项,可以配置ARM空闲多久之后进入低功耗模式,也就是idle多久之后进入睡眠模式,时间单位是CPU时钟节拍1Tick。
而在多线程的C++代码中,while(true){sched_yeild();...}死循环必定会让CPU100%。那是因为线程让出时间片后,没有其他任务,导致CPU马上又重新进入了这个线程,所以,CPU的计算过程一直没有停下来,所以,CPU一直100%。所以,在FreeRTOS的系统设计中,while循环中必须加入osDelay,至少加入osDelay(1);在Linux软件设计中,while死循环必须加入usleep(1000);,以防止CPU100%。
顺便说一句,对于while(true)fork();的恶搞,考验的是系统管理员以及技术管理员的等级,等级高的会知道Linux操作系统有一个比Windows Server的系统配额配置更优秀的管理配置,可以配置每个用户最多使用的内存量和最多打开的文件描述符数量以及最多打开的进程数量。
比如,每个用户的内存使用上限的限制:
/etc/security/limits.conf
@admin hard rss 11000000
* hard rss 21000000
第一行是用户组admin最多使用内存(rss)11GB,第二行是所有用户累计最多使用内存(rss)21GB
/etc/security/limits.conf
@admin hard nproc 1024
* hard nproc 10240
第一行是用户组admin最多开启1024个进程,第二行是所有用户累计最多开启10240个进程
/etc/security/limits.conf
@admin hard cpu 150
第一行是用户组admin最多占用150%的CPU
其中,如果用soft,那就可以超过,只是超过后会有告警;如果用hard,那就限制不能超过。@表示组
一个有用的Linux命令:
ulimit -a
附言一句:我没有什么机密,我也不是黑客。