Ubuntu 22.04 LTS 测试版实时内核已可申请

在4月21日,Canonical宣布了Ubuntu 22.04 LTS的实时内核新特性,已可申请测试。

测试版实时内核基于上游 v5.15,22.04 LTS 内核集成了针对 x86_64 和 AArch64 架构的树外 PREEMPT_RT 补丁。一旦进入 GA (通用可用性),新的实时内核将为下一代机器人、物联网和电信创新提供确定性的响应时间,以满足其极低的延迟要求。

确定性的响应时间

实时 Ubuntu 测试版的调度程序可以抢占内核中的线程,包括关键部分、中断处理程序和中断禁用代码序列,保证有界的响应。通过最小化内核代码中不可抢占的关键部分,PREEMPT_RT 补丁(尚未完全上游)使测试内核比主线更具抢占性。

为生产做好准备

由于这是一个 beta 版本内核,它不提供任何支持,同时也建议不要将其用于生产工作负载。我们致力于将实时内核带入生产级别,而您的反馈将帮助我们实现此目标。请考虑通过此处报告您可能遇到的任何错误来测试并积极影响 Ubuntu 社区。

此外,请考虑加入我们的免费测试计划,与我们的团队建立一个开放的沟通渠道,提供反馈并分享建议。作为实时 Ubuntu beta 测试人员,一旦内核准备好用于生产,我们将首先通知您。

获得测试版实时内核

测试内核可通过Ubuntu订阅个人版(UA-I) 获得且免费供个人使用,这是最全面的 Linux 企业订阅,涵盖开放基础架构的所有方面。

要将您的个人计算机添加到 UA 订阅,请运行:

ua attach <免费的TOEKN>

确保你在使用至少27.8版本的ubuntu-advantage-tools软件包,可通过此命令查看当前版本:

ua version

要在Ubuntu 22.04(Jammy Jellyfish)中升级ubuntu-advantage-tools到27.8,请运行命令:

sudo apt install ubuntu-advantage-tools=27.8~22.04.1

要启用测试版实时内核,可运行:

ua enable realtime-kernel –beta

请注意,在启用实时内核后您需要手动配置 grub 以恢复到原始内核。更多内容请参考:

ua help realtime-kernel

来自:cn.ubuntu.com
作者:Edoardo Barbieri 

一条命令部署FreeRTOS for XR806交叉编译环境

之前,全志科技XR806主要是用来跑OpenHarmony(鸿蒙)的。

但由于鸿蒙这个操作系统还比较新,编译环境配置起来有些麻烦,于是我就做了一个基于Docker的交叉编译环境。

最近看到全志科技公布了XR806的FreeRTOS SDK,赶紧一探究竟。

其实全志之前出了几个版本,现在这个1.2.1版本经过多方测试,比较稳定。

先来看看这个版本的主要功能。

xr806_sdk-v1.2.1的主要功能描述如下:

1、支持WiFi STA/AP模式;
2、支持WiFi WPA3功能;
3、支持BLE扫描、广播、连接、配对;
4、支持BLE MESH;
5、支持SoundConfig、AirKiss、SmartConfig、APConfig配网;
6、支持MbedTLS、MQTT、WebSocket等多种网络协议;
7、支持PSRAM、DMA、GPIO、UART、PWM、CODEC播放与录音、ADC转换、硬件加解密、看门狗等多种外设;
8、支持MP3、M4A、AAC、AMR、TS、M3U8等音频的播放,支持Flash、HTTP、HTTPS、音频数据流播放。

FreeRTOS是国际上比较流行的一款MCU的嵌入式操作系统。

历史悠久,用户基础很大。

为了方便初学者调试,我这里顺便做了一个FreeRTOS交叉编译的Docker版本。

Docker官方仓库地址:

https://hub.docker.com/r/verdureorange/ubuntu_xr806

安装方式:

在已经安装Docker的情况下,执行以下命令:

docker run -it verdureorange/ubuntu_xr806:v2 /bin/bash

注:v1是OpenHarmony的环境,v2才是FreeRTOS的,请勿搞混。

全志XR806 FreeRTOS_BSP编译

1、构建工作文件夹
(1)cd ~
(2)mkdir work
(3)cd work
(4)mkdir xr806
(5)cd xr806
2、获取资源
(1)wget http://www.armsoc.cn/whycan/xr806/xr806_sdk_v1.2.1.tgz
(2)wget http://www.armsoc.cn/whycan/xr806/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2

如果获取失败,直接whycan下载(可能需要积分)
–>freeRTOS bsp
    xr806_sdk_v1.2.1.tgz
–>gcc工具链   
    gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
3、编译一个例程
(1)解压bsp
tar -xzvf xr806_sdk_v1.2.1.tgz
(2)选择一个例程进行编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo
ls
可以看到现在有一下几个例程

book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo$ ll
总用量 32
drwxrwxr-x  8 book book 4096 4月   2 16:50 ./
drwxrwxr-x 10 book book 4096 4月   2 16:50 ../
drwxrwxr-x  3 book book 4096 4月   2 17:26 at_demo/
drwxrwxr-x  4 book book 4096 4月   2 17:23 audio_demo/
drwxrwxr-x  8 book book 4096 4月   2 16:50 bluetooth/
drwxrwxr-x  3 book book 4096 4月   2 17:22 hello_demo/
drwxrwxr-x  4 book book 4096 4月   2 16:50 wlan_ble_demo/
drwxrwxr-x  3 book book 4096 4月   2 16:50 wlan_demo/

(3)选择hello_demo
    cd hello_demo
(4)进入gcc目录,进行编译
cd gcc
make
    结果,编译出错了,原因是我们没有安装交叉编译工具链。

...
/bin/sh: 1: /home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc: not found
../../../../project/project.mk:437: recipe for target 'hello_demo.elf' failed
make[1]: *** [hello_demo.elf] Error 127
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
../../../../project/project.mk:426: recipe for target '__all' failed
make: *** [__all] Error 2

4、安装交叉编译工具链
(1)解压工具链
cd ~/work/xr806/
tar -xvf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
(2)复制到项目例程指定的目录
根据上面的错误信息,我们可以知道交叉编译工具链,应该是存放在这个位置:
/home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/

cd ~
mkdir tools
cd ~/work/xr806/
cp -r gcc-arm-none-eabi-8-2019-q3-update ~/tools/

5、回到例程目录,重新编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc/
make
编译结果,看起来像是成功了

~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -R .xip   hello_demo.elf hello_demo.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -j .xip hello_demo.elf hello_demo_xip.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-size hello_demo.elf
   text    data     bss     dec     hex filename
  39768    1576    2248   43592    aa48 hello_demo.elf
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$ 

我们得到了两个bin文件,一个elf文件
hello_demo.bin
hello_demo_xip.bin
hello_demo.elf

6、烧写程序到开发板

(1)生成烧写镜像
上述make只是生成了bin文件,我们需要进一步生成烧写镜像,才可以顺利下载。
make image

Flash Layout:
sec bin 0 boot_40M.bin      :   flash_offs: 0x00000000(   0K)   data_size: 0x00002F28(  12K)
sec bin 1 app.bin           :   flash_offs: 0x00004000(  16K)   data_size: 0x00004920(  19K)
sec bin 2 app_xip.bin       :   flash_offs: 0x00029800( 166K)   data_size: 0x000058E0(  23K)

generate image: xr_system.img
cp -t ../../../../out/ ../image/"xr806"/*.bin ../image/"xr806"/xr_system.img *.map
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$ 

(2)获取工具
工具存放在bsp包./tools目录里,程序文件为phoenixMC.exe。

(3)烧写镜像

作者:LinjieGuo

来自:WhyCan Forum

世界上第一只炒加密货币的小仓鼠,3个月赚了50%

世界之大,无奇不有。

你能想象仓鼠炒加密货币,还赚了不少钱吗?

最近国外有一只名叫Mr Goxx的仓鼠火了。

它是世界上第一只仓鼠加密货币交易员。

仓鼠Mr Goxx的业绩还真不错。

3个多月时间回报率达到19.41%。

在某段时间中,Mr Goxx的投资组合上涨了50%。

而同一时段,比特币也才上涨41%。

大家盘点一下自己今年的投资业绩。

和仓鼠Mr Goxx比一下,是不是有点拿不出手。

仓鼠怎么投资呢?

原理很简单,和预测足球胜负的章鱼保罗类似。

早些年,动物界出了个“神算子”章鱼保罗。

章鱼保罗以擅长预测足球比赛输赢闻名于世。

章鱼保罗是怎么预测的呢?

每次比赛前,在两支队伍的国旗下都摆上同样的食物。

章鱼保罗吃哪边的食物,就代表它猜哪支队伍赢。

简单说,全靠蒙成就了章鱼保罗的江湖地位。

当然你非要说章鱼保罗有什么超能力,我也没法反驳你。

仓鼠Mr Goxx用类似的方法交易加密货币。

仓鼠Mr Goxx居住的笼子是它的卧室。

卧室旁边有一个设计精巧的“办公室”。

办公室里有一个滚轮,随着仓鼠在上面奔跑,转动的滚轮会自动从30种加密货币中挑选出当天要买卖的加密货币。

选好之后,地上有两条管道,一条代表“买入”,一条代表“卖出”,

仓鼠钻哪条,就执行哪种交易命令。

Mr Goxx是在6月12日进入加密货币市场的,启动资金326欧元。

在刚开始的第一个月里,它交易了95次,最后亏了7.3%。

随后业绩慢慢好转,截止9月27日,Mr Goxx的从业回报率达到19.41%。

让仓鼠炒加密货币的主意,源于仓鼠主人和朋友的一个玩笑。

两人都来自德国,今年30多岁。

他们觉得现在什么都贵,年轻人太不容易了。

付完高昂的房租,几乎存不下什么钱。

对这代年轻人来说,好像除了把积蓄投入加密货币外,没有其他致富的机会了。

但对加密货币,其实很多人都一无所知。

仓鼠的主人就开了个玩笑,我家仓鼠会不会比人更会投资?

两人并不是嘴上说说,真的马上行动起来,给仓鼠打造了上面这个办公室。

两人作为出资方,投资给仓鼠交易员326欧元本金后,仓鼠就开始它的加密货币交易了。

仓鼠的名字Mr Goxx也大有来头。

这个名字源于曾经世界上最大的加密货币交易所——日本公司“Mt Gox”。

2014年Mt Gox遭黑客入侵,被盗走了价值约4.6亿美元的比特币,直接破产了。

Mr Goxx的交易策略就是没策略。

就这么随意的钻钻跑跑,居然也赚到了这么多。

真是应了那句话,风口来的时候,仓鼠都能飞上天。

两人把仓鼠交易员的日常通过自动化程序发到网上。

每当它跨进办公室,它在Twitch的直播会立即开启,推特也会发出一行文字:Mr Goxx已经开始交易。

它的每条投资动态下面,都专门备注了一句话:内容仅供娱乐,不作为投资建议。

真的有人会学着仓鼠做交易吗?

仓鼠都能炒加密货币的今天,好像也没什么不可能。

仓鼠Mr Goxx虽然业绩不俗,但因为本金太少,它赚的钱连笼子的钱都不够。

仓鼠Mr Goxx这个名字,也让人联想到破产交易所,暗含了对加密货币市场风险的担忧。

有趣的是,现实生活中许多人们眼中的投资明星,成功之道和仓鼠可能真的差不多。

巴菲特1984年在哥伦比亚大学商学院做了一次演讲。

演讲中他提到一个“全美抛硬币猜正反面大赛”的小故事。

假设全美国2.25亿人每天都参加一次抛硬币赌1美元的游戏。

输家被淘汰出局,赢家把输家手中的钱拿走,再全部投入作为第二天的赌注。

经过十个早上的比赛,将大约有22万名美国人连续获胜,他们每人可赢得略微超过1,000美元的钱。

这时他们就会吹嘘自己在抛硬币上如何技术高超,如何天才过人。

再过10天,将会有215位连续猜对20次硬币的正反面的赢家。

他们每个人用1美元赢得了100多万美元。

他们很可能会写一本书——“我如何每天只需工作30秒就在20天里用1美元赚到100万美元”。

他们还会在全国飞来飞去,参加各种抛硬币神奇技巧的研讨会。

这些用1美元本金,20天时间赚了100多万美元的幸运儿,本质上和仓鼠Mr Goxx差不多。

仓鼠Mr Goxx和人类相比,吃亏在不能发声表达。

否则它只要出几本书,上几次电视,同样能成为投资界一颗新星。

随机性和偶然性让投资世界充满了奇幻色彩。

仓鼠Mr Goxx的投资业绩告诉我们,选择很重要。

当你选择了风口行业,就像上了一部上行电梯。

你一定要对此心知肚明,别觉得自己多厉害。

下次再有人吹嘘自己高超的投资技能时,你应该清楚他可能只是另一只幸运的仓鼠而已。

python-crontab 设置定时任务

通过python-crontab 设置定时任务(创建设置定时任务的.py文件,并运行即可)
安装包: pip install python-crontab

创建新的py文件, 内容如下:

from crontab import CronTab
# 创建linux系统当前用户的crontab,当然也可以创建其他用户的,但得有足够权限,如:user='root'
cron_manager = CronTab(user=True)


# 创建任务 指明运行python脚本的命令(crontab的默认执行路径为:当前用户的根路径, 因此需要指定绝对路径)
job = cron_manager.new(command='python /root/hong/crontab_test/data_test.py >> /root/hong/crontab_test/data_result.log 2>&1 &')

# 设置任务执行周期,每两分钟执行一次

job.setall('*/2 * * * *')

# 将crontab写入linux系统配置文件
my_user_cron.write()

运行py文件,完成! 此时定时任务已经创建(可在linux终端 输入 contrab -l 查看), crontab 会按照设定的时间 定时调用指定路径下的data_test.py文件。

作者:酷酷的图图
链接:https://www.jianshu.com/p/925de5998e1d

Python实现二分查找法

基本思想:对于一个有序数组,从数组中间元素开始与target元素进行比较,target较大则到中间元素的右半部分继续二分查找,target较小则到中间元素的左半部分继续二分查找,相等则查找到了target缘故。

注意:
(1)必须是有序数组
(2)target元素可能找不到

两种实现方法:注意索引边界的不同。

def binarySearch(list, target):
	left = 0
	right = len(list) - 1  
	#在list[left...right]里查找target,注意是左闭右闭
	while left <= right:
		mid = (right + left) // 2    #取中间元素索引
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right]里查找
		else:  #target < list[mid]
			right = mid - 1    #到list[left ...mid - 1]里查找
	return -1    #未找到target元素
def binarySearch(list, target):
	left = 0
	right = len(list)
	#在list[left...right)里查找target,注意是左闭右开
	while left < right:
		mid = (right - left) // 2 + left    #防止上面的写法整型溢出
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right)里查找
		else:  #target < list[mid]
			right = mid        #到list[left ...mid)里查找
	return -1     #未找到target元素

二分查找法的时间复杂度:O(logn)

3、循环不变量:在循环中不改变的量,即在循环开始和在循环迭代过程中永远保持不变的条件。

比如二分查找的第一个写法里循环开始和在循环迭代过程中要一直保持在list[left…right]左闭右闭的范围里查找target,这个条件就是一个循环不变量。

其他数据结构基本算法的Python实现版本可从github:全python实现的数据结构与算法中获取

如何将树莓派CM4的Wi-Fi改为外置天线

树莓派 CM4 在设计时考虑到兼容性,系统默认用的是内置 PCB 天线。那怎么设置,切换到外置 WiFi 天线呢?

首先,你得把树莓派 CM4 天线(Antenna Kit)给焊上去,也就是下图那个黄色圆点。 

然后编辑 /boot/config.txt 文件。

在文件末尾加入一行配置:

dtparam=ant2

然后重启 树莓派CM4 ,让配置生效即可。

一个外置天线,大概三十多块钱人民币吧。

一条命令搞定全志XR806编译环境

XR806广泛应用于家电、安防等产品,比如以下案例。

  1. 智能家电,如空凋、冰箱、洗衣机,通过无线模组,通过家电<->服务器<->手机的连接关系,实现远程控制。
  2. IPC。即网络摄像头,网络编码模块将模拟摄像机采集到的模拟视频信号编码压缩成数字信号,从而可以直接接入网络交换及路由设备。
  3. 智能门锁。XR806特有的超低功耗技术,保证了稳定连接的前提下也保证了续航。

但是编译环境的设置比较麻烦,这里提供容器化安装方式,一条命令装好(使用前必须先安装Docker)

省的大家又是找源代码,又是配置环境了。

docker pull verdureorange/ubuntu_xr806:v1

Ubuntu 20.04 for Allwinner XR806.

Integrated demo codes and compilation tools, easy to quickly generate image package.

Teaching video: https://youtu.be/maNb565bnyI

Author: Medivh

If you have any questions, you can send me an email. Email:verdureorange@gmail.com

Linux /dev/mapper/ubuntu–vg-ubuntu–lv磁盘满了怎么解决

在安装Ubuntu Server后,经常会发现磁盘没用到一半突然满了。

这大概率是你在安装Ubuntu Server的时候采用了LVM模式。

可以先用指令 df -h 查看磁盘情况。

root@mysheep:/var/lib/docker# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               955M     0  955M   0% /dev
tmpfs                              198M  1.2M  196M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  3.9G  3.5G  237M  94% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/loop0                          90M   90M     0 100% /snap/core/8039
/dev/loop1                          89M   89M     0 100% /snap/core/7270
/dev/sda2                          976M   77M  832M   9% /boot
tmpfs                              198M     0  198M   0% /run/user/1000

所以现在需要扩容,用指令显示存在的卷组,vgdisplay

root@mysheep:/var/lib/docker# vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       1024 / 4.00 GiB
  Free  PE / Size       3839 / <15.00 GiB
  VG UUID               lhPVeA-sFX5-5sQ6-2mAq-VR41-uvjU-YrPzFI

看到这一行,发现还能扩容:

Free PE / Size 3839 / <15.00 GiB

这就是可以扩充的大小。

lvextend -L 120G /dev/mapper/ubuntu--vg-ubuntu--lv     //增大至120G
lvextend -L +20G /dev/mapper/ubuntu--vg-ubuntu--lv     //增加20G
lvreduce -L 50G /dev/mapper/ubuntu--vg-ubuntu--lv      //减小至50G
lvreduce -L -8G /dev/mapper/ubuntu--vg-ubuntu--lv      //减小8G
lvresize -L  30G /dev/mapper/ubuntu--vg-ubuntu--lv     //调整为30G
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv            //执行调整

上面是示范,可以根据自身情况来进行扩容,最后执行最后的调整指令,然后就扩充成功了。

oot@mysheep:/var/lib/docker# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               955M     0  955M   0% /dev
tmpfs                              198M  1.2M  196M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  9.8G  3.5G  5.9G  37% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/loop0                          90M   90M     0 100% /snap/core/8039
/dev/loop1                          89M   89M     0 100% /snap/core/7270
/dev/sda2                          976M   77M  832M   9% /boot
tmpfs                              198M     0  198M   0% /run/user/1000

文章来自:https://blog.csdn.net/Fish_Sheep/article/details/103325378

急招:软件安全验证工程师(安谋科技)

地点:

深圳 or 上海市(均可)

时间:

2022年3月-12月

职位描述:

作为安全团队的软件验证工程师,你不仅将是验证概念者,还将与开发工程师一起参与复杂系统的设计,并对软件质量提供有效和深入的见解。 通过不断提高验证执行效率和测试代码覆盖率,你将成为软件质量的强有力的保障。  

角色和责任:

一、安全软件的验证案例设计和实现,验证执行,bug报告和跟踪。

二、与研发人员深度合作,确保产品迭代质量。

三、持续优化和增强验证用例/代码。

四、严格执行测试流程,为流程改进提供建设性意见。  

五、设计和实现自动测试框架和测试用例。  

要求:

一、熟悉软件测试方法,流程和机制,安全栈优先。  

二、包括以下验证目标:固件,RTOS(例如,mbed或Zephyr), Linux内核/驱动程序,网络堆栈,中间件。  

三、熟悉微服务的概念,有实际验证经验者优先。  

四、有设计/实现自动测试框架开发的经验。  

五、理解移动和物联网设备中的基本安全概念(例如加密方案)。  

六、开放,自我激励和团队合作精神。  

七、3~5年软件验证经验。  

联系方式:

有意者可将简历发送至:Will.Wang@armchina.com