实现安卓LED设备驱动:不写一行代码

news2024/11/19 5:49:16

文章目录

  • 一、前言
  • 二、准备工作
    • 2.1 内核版本
    • 2.2 内核文档:bindings->leds
    • 2.3 文档解析: leds-gpio.txt
  • 三、编写DTS
    • 3.1 查原理图,挑选GPIO
    • 3.2 编写DTS文件
  • 四、编译测试
    • 4.1 编译dt.img
    • 4.2 烧录dt.img
  • 五、基于fs的测试
    • 5.1 测试命令
    • 5.2 **点灯效果**
  • 六、C语言:编写NDK测试APP
  • 七、结束语

一、前言

安卓设备驱动,本质上依旧还是Linux架构的驱动程序,基于Linux Kernel。在做安卓ROM开发的过程中,我们经常要控制设备的LED灯,许多情况下,我们直接就去写了一个LED的字符设备驱动,却不知,这类驱动,在kernel driver大神手下,早就给我们写了通用版本,但凡我们多看它一眼,就可以站在巨人的肩膀上,不写一行代码……,但工资还是要领……

二、准备工作

2.1 内核版本

在板子上执行如下命令,可获知当前设备的内核版本为4.9.113; 这是目前Android 9.0普遍使用的一个版本。另一方面,从2.6版本开始,kernel就已经支持Device Tree(设备树),所以,接下来的工作,重点其实就是设备树文件的书写!

:/ # cat /proc/version                                                         
Linux version 4.9.113 (root@d185403d1e6f) (gcc version 6.3.1 20170109 (Linaro GCC 6.3-2017.02) ) #24 SMP PREEMPT Tue Dec 20 15:42:34 UTC 2022
:/ # 

2.2 内核文档:bindings->leds

  • android9.0_aosp/common 目录,即为我所使用的Amlogic T972平台的安卓内核源代码目录
  • 在下图common\drivers\leds 目录中,leds-gpio.txt就是通用GPIO LED驱动的bindings文档,基于GPIO实现
  • 同时,我们可以看到leds-pwm.txt,这是PWM实现的另一个版本。
  • GPIO LED 版本,对于亮度的控制,只0和1(非0)两个逻辑值,0代表灭灯,1代表开灯;而PWM版本,则可以实现最大256级的亮度控制。

image

2.3 文档解析: leds-gpio.txt

LEDs connected to GPIO lines
翻译:LED灯需要物理连接到对应的GPIO口上

Required properties:
- compatible : should be "gpio-leds".
翻译:LED设备树节点的 “compatible ”属性,必须是 "gpio-leds"

Each LED is represented as a sub-node of the gpio-leds device.  Each
node's name represents the name of the corresponding LED.
翻译:每个LED均为gpio-leds的子节点,这些子节点的name就代表了LED设备的名字

LED sub-node properties:
翻译:在"gpio-leds"节点下面的LED子节点属性说明

- gpios :  Should specify the LED's GPIO, see "gpios property" in
  Documentation/devicetree/bindings/gpio/gpio.txt.  Active low LEDs should be
  indicated using flags in the GPIO specifier.
翻译:gpios 用于指定LED所使用的GPIO

备注:(optional)可选项在这里就不做介绍了,有兴趣的自行查阅一下文档
- label :  (optional) //如设定,将替代led节点的name属性
  see Documentation/devicetree/bindings/leds/common.txt

- linux,default-trigger :  (optional)
  see Documentation/devicetree/bindings/leds/common.txt

翻译:用于设定LED的初始值
- default-state:  (optional) The initial state of the LED.
  see Documentation/devicetree/bindings/leds/common.txt 

翻译:展开leds/common.txt 关键部分
- default-state : The initial state of the LED. Valid values are "on", "off",
  and "keep". If the LED is already on or off and the default-state property is
  set the to same value, then no glitch should be produced where the LED
  momentarily turns off (or on). The "keep" setting will keep the LED at
  whatever its current state is, without producing a glitch.  The default is
  off if this property is not present.
说明:
(1) default-state 有3个有效值: "on", "off",  "keep",用于设定LED的初始值。
(2) 设定为"keep"时,LED GPIO 将保持原状,不做任何处理 
(3) LED GPIO的初始状态应保持和default-state值含义一致,以免出现闪烁(glitch )


- retain-state-suspended: (optional) The suspend state can be retained.Such
  as charge-led gpio.
- panic-indicator : (optional)
  see Documentation/devicetree/bindings/leds/common.txt

例子
Examples:

#include <dt-bindings/gpio/gpio.h>
翻译:在此头文件中,包含了如下两个宏的定义
/* Bit 0 express polarity */
// #define GPIO_ACTIVE_HIGH 0  , 代表GPIO物理线路给高电平时会点亮,即高电平有效
// #define GPIO_ACTIVE_LOW 1   , 即低电平有效


leds {
	compatible = "gpio-leds"; //强制要求,要用大神的GPIO LED驱动,暗号得一样
	hdd { //led设备名称为hdd,但因为label出现,变成了"Disk Activity"
		label = "Disk Activity";
		gpios = <&mcu_pio 0 GPIO_ACTIVE_LOW>; //使用mcu_pio控制器下的GPIO 0,且设定低电平有效
		linux,default-trigger = "disk-activity";
	};

	fault {
		gpios = <&mcu_pio 1 GPIO_ACTIVE_HIGH>; //使用mcu_pio控制器下的GPIO 1,且设定高电平有效
		/* Keep LED on if BIOS detected hardware fault */
		default-state = "keep";//将沿用GPIO上电后的状态,不设置初始值
	};
};

run-control { // LEDs设备目录名称为run-control
	compatible = "gpio-leds";
	red { // LEDs子设备名为 red
		gpios = <&mpc8572 6 GPIO_ACTIVE_HIGH>;
		default-state = "off"; //设定默认关,此PIN为高电平有效,所以开机后会将GPIO 6拉低
	};
	green {
		gpios = <&mpc8572 7 GPIO_ACTIVE_HIGH>;
		default-state = "on";
	};
};

leds {
	compatible = "gpio-leds";

	charger-led {
		gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
		linux,default-trigger = "max8903-charger-charging";
		retain-state-suspended;
	};
};

三、编写DTS

3.1 查原理图,挑选GPIO

  • 如下挑选GPIOZ_1作为实验对象, 同时,我们还得选一个GND,可以挑选PIN-48

接线方法如下,因为没有LED灯,我这里用一个普通小灯泡代替,如果是LED灯,注意二极管PN结的方向,别接反了

图一:原理图
image

图二:接线图
image

3.2 编写DTS文件

/ {
//…… 前 略 ……
 //
	leds {

	    status = "okay"; //设备OK的,或disabled禁用
            compatible = "gpio-leds";  //大神的要求,固定
            led2{ //设备名称为led2
		gpios = <&gpio GPIOZ_1 GPIO_ACTIVE_HIGH>; //使用gpio 控制的GPIOZ_1 ,高电平有效
		default-state = "off"; //默认状态是灭灯
            };
	};
//
//…… 后 略 ……
}

四、编译测试

4.1 编译dt.img

$ source  build/envsetup.sh
$ lunch  your-board

//1. 如果未做过完整编译,则直接全编译
$ make -j32  

//2. 如果已做过完成编译,则可以使用局部编译
$ make dtbimage -j32 

编译打印如下:

[100% 1/1] Instaled out/target/product/x301/dt.img
make: Entering directory `/home/builder/android_x301/source/t962x3-t972-android9.0/common'
make[1]: Entering directory `/home/builder/android_x301/source/t962x3-t972-android9.0/out/target/product/x301/obj/KERNEL_OBJ'
  CHK     scripts/mod/devicetable-offsets.h
  DTC     arch/arm/boot/dts/amlogic/pro-box-t972.dtb
make[1]: Leaving directory `/home/builder/android_x301/source/t962x3-t972-android9.0/out/target/product/x301/obj/KERNEL_OBJ'
make: Leaving directory `/home/builder/android_x301/source/t962x3-t972-android9.0/common'
Generate Partition Table Xml From  common/arch/arm/boot/dts/amlogic//partition_mbox_normal_P_32.dtsi to out/target/product/x301/emmc_burn.xml
part-1          logo            0x800000
part-2          recovery        0x1800000
part-3          misc            0x800000
part-4          dtbo            0x800000
part-5          cri_data        0x800000
part-6          param           0x1000000
part-7          boot            0x1000000
part-8          rsv             0x1000000
part-9          metadata        0x1000000
part-10         vbmeta          0x200000
part-11         tee             0x2000000
part-12         vendor          0x1C000000
part-13         odm             0x8000000
part-14         system          0x50000000
part-15         product         0x8000000
part-17         data            0xffffffff
Generate Partition Table Xml Sucess

#### build completed successfully (01:27 (mm:ss)) ####

Build dts ok!
root@d185403d1e6f:/home/builder/android_x301/source/t962x3-t972-android9.0# 

[100% 1/1] Instaled out/target/product/x301/dt.img

编译完后,获取dt.img, 我的平台位于:out/target/product/x301/dt.img

4.2 烧录dt.img

单独分区dt.img的烧录方法,可以参考芯片原厂提供的方法,如下是Amlogic T972的烧录方法,也是安卓的标准方法。

(1)将out/target/product/x301/dt.img 赋值到Burning.bat工具的同级目录下

(2)使用USB双公头线,连接板子OTG USB口, 另一端连接PC USB口

(3)双击运行Burning.bat,选择5,烧录dt

(4)如下图所示,烧录后板子会自动重启

图一:烧录工具目录
image

烧录打印如下:

adb connecting...
List of devices attached
1234567890      device


****** Burning way by fastboot ******

 1: boot               ---- boot.img
 2: logo               ---- logo.img
 3: recovery           ---- recovery.img
 4: system             ---- system.img
 5: dtb (dts)          ---- dt.img
 6: uboot (bootloader) ---- uboot.bin
 7: vendor             ---- vendor.img
 8: odm                ---- odm.img
 9: vendorboot         ---- vendor_boot.img

Which number you like?5
dts ---- dt.img

< waiting for any device >
FAILED (Device sent unknown status code:      )
fastboot: error: Command failed
OKAY [  0.045s]
Finished. Total time: 0.046s
fastboot flash dts dt.img
Sending 'dts' (101 KB)                             OKAY [  0.021s]
Writing 'dts'                                      OKAY [  0.155s]
Finished. Total time: 0.297s
OKAY [  0.043s]
Finished. Total time: 0.047s
OKAY [  0.045s]
Finished. Total time: 0.047s
Rebooting                                          OKAY [  0.002s]
Finished. Total time: 0.004s

Press any key to exit...

图二、烧录图示
image

五、基于fs的测试

5.1 测试命令

//(1)连接USB OTG,板子ADB服务
Z:\>adb usb
restarting in USB mode

//(2)进入板子shell模式
Z:\>adb shell

//(3)通过SYS-FS文件系统,找到我们在dts中创建的设备,可见设备TOP目录名为父节点名leds,子节点名为设备led2
:/ # cd /sys/class/leds/
:/sys/class/leds # ls -al
total 0
drwxr-xr-x   2 root root 0 2022-12-24 11:02 .
drwxr-xr-x 131 root root 0 2022-12-24 11:02 ..
lrwxrwxrwx   1 root root 0 2022-12-24 11:05 led2 -> ../../devices/platform/leds/leds/led2

//(4)进入led2的目录
:/sys/class/leds # cd led2/
:/sys/class/leds/led2 # ls -al
total 0
drwxr-xr-x 3 root root    0 2022-12-24 11:02 .
drwxr-xr-x 3 root root    0 2022-12-24 11:02 ..
-rw-r--r-- 1 root root 4096 2022-12-24 11:06 brightness      --> 这是设定亮度的属性,GPIO-LED只有01
lrwxrwxrwx 1 root root    0 2022-12-24 11:06 device -> ../../../leds
-r--r--r-- 1 root root 4096 2022-12-24 11:06 max_brightness  --> 这是设定亮度的最大值,对于PWM-LED有效,最大255
drwxr-xr-x 2 root root    0 2022-12-24 11:02 power
lrwxrwxrwx 1 root root    0 2022-12-24 11:06 subsystem -> ../../../../../class/leds
-rw-r--r-- 1 root root 4096 2022-12-24 11:06 trigger
-rw-r--r-- 1 root root 4096 2022-12-24 11:02 uevent

//(5)查看亮度默认值,可见如我们的 default-state = "off"; //默认状态是灭灯
:/sys/class/leds/led2 # cat brightness
0

//(6)测试:点灯
:/sys/class/leds/led2 # echo 1 > brightness

//(7)测试:灭灯
:/sys/class/leds/led2 # echo 0 > brightness

5.2 点灯效果

image

六、C语言:编写NDK测试APP

6.1 创建文件和目录

(1) 找个安卓的子目录,例如 development
szhou@bc04:~$ cd ~/T972/android_x301/source/t962x3-t972-android9.0/development

(2) 创建一个目录,姑且就叫led
szhou@bc04:~/T972/android_x301/source/t962x3-t972-android9.0/development$ mkdir led 

(2) 创建 Android.mk 和 test-led.c文件
szhou@bc04:~/T972/android_x301/source/t962x3-t972-android9.0/development$ tree  led   
led
├── Android.mk
└── test-led.c

0 directories, 2 files

6.2 Android.mk

  • 编译后的模块名称为 test-led, 它是一个可执行文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := test-led
LOCAL_SRC_FILES := test-led.c

include $(BUILD_EXECUTABLE)

6.3 test-led.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

//led2设备节点的路径,将设置属性brightness
#define LED_DEV_PATH	"/sys/class/leds/led2/brightness"

int SetFsLed(char *onOff)
{
	int fd;
	int ret;

        //通过fs系统调用,打开设备文件
	fd = open(LED_DEV_PATH, O_WRONLY);
	if (fd == -1) {
		perror("fsled->open " );
		return -1;
	}

        //通过fs系统调用,向设备文件写入具体的控制值,此处即操作文件 "/sys/class/leds/led2/brightness"
	ret = write(fd, onOff, strlen(onOff));
	if (ret == -1) {
		perror("fsled->write");
		close(fd);
		return -1;
	}

	close(fd);
	return 0;
}

int main()
{
	while (1) {
		SetFsLed("1\n");
		usleep(500000); //即半秒开,半秒灭,循环闪烁
		SetFsLed("0\n");
		usleep(500000);
	}
}

6.4 编译

  • 需要先做一次完整的编译,才可使用局部编译命令
  • 生成文件位置:[100% 6/6] Install: out/target/product/x301/system/bin/test-led
1)准备环境
$ source  build/envsetup.sh
$ lunch  your-board

(2)局部编译 test-led 模块,源于Android.mk的 LOCAL_MODULE    := test-led
$ make  test-led

打印如下

root@d185403d1e6f:/home/builder/android_x301/source/t962x3-t972-android9.0# source  build/envsetup.sh      
// …… 略 ……
root@d185403d1e6f:/home/builder/android_x301/source/t962x3-t972-android9.0# lunch 

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
// …… 略 ……
     84. x301-userdebug

Which would you like? [aosp_arm-eng] 84
// ……略……

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=9
TARGET_PRODUCT=x301
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a9
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.11.0-49-generic-x86_64-Ubuntu-14.04.6-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=PPR1.180610.011
OUT_DIR=out
============================================
// ……略……
build/make/core/Makefile:28: warning: overriding commands for target `out/target/product/x301/obj/lib_vendor/mxl661_fe.ko'
device/amlogic/x301/Kernel.mk:178: warning: ignoring old commands for target `out/target/product/x301/obj/lib_vendor/mxl661_fe.ko'
[100% 6/6] Install: out/target/product/x301/system/bin/test-led

#### build completed successfully (01:47 (mm:ss)) ####

root@d185403d1e6f:/home/builder/android_x301/source/t962x3-t972-android9.0# 

生成文件位置:[100% 6/6] Install: out/target/product/x301/system/bin/test-led

6.5 执行 test-led

我这里已经将服务器SAMBA挂载到了PC的Z盘

6.5.1 操作命令

1)切换到服务器的bin生成目录
c:\>cd Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin
c:\>z:2)获取root权限
Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin>adb root
restarting adbd as root

(3)推送文件到板子的/data目录下
Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin>adb push test-led /data/
test-led: 1 file pushed, 0 skipped. 1.1 MB/s (16016 bytes in 0.014s)4)修改文件属性为可执行文件
Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin>adb shell chmod 777 /data/test-led

(5)执行 ./data/test-led
Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin>adb shell ./data/test-led

6.5.2 命令图示

执行后,灯泡将闪烁起来

图二:执行的命令界面
image

图二:点灯效果如下图 不过这次是闪烁的,0.5秒亮,0.5秒灭
image

七、结束语

内容虽然简单,但却得周末爆肝才能写完……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式,给定一个单链表,判断单链表的值是否是回文结构【图文解释包你看懂】

将单向链表按照目标值value 划分成左边小&#xff0c;中间等&#xff0c;右边大的形式 例如 1 -> 3 -> 5-> 3 -> 7 按照value 3划分 1-> 3-> 3 -> 5 -> 7 解题思路&#xff1a;给定值为 value 用6个变量&#xff0c;分别表示 小于value 的Head sH &…

2023年天津中德应用技术大学专升本专业课考试具体安排及准考证

2023年天津中德应用技术大学高职升本科专业课考试准考证下载及考生须知 一、准考证下载打印 12月24日12点开始&#xff0c;专业课报名审核通过的考生&#xff0c;登录学校专业课报名系统&#xff08;114.115.135.236/jobgroup/f&#xff09;&#xff0c;点击“准考证”&#xf…

Qt之悬浮球菜单

一、概述 最近想做一个炫酷的悬浮式菜单&#xff0c;考虑到菜单展开和美观&#xff0c;所以考虑学习下Qt的动画系统和状态机内容&#xff0c;打开QtCreator的示例教程浏览了下&#xff0c;大致发现教程中2D Painting程序和Animated Tiles程序有所帮助&#xff0c;如下图所示&a…

Java反射面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

科技交流英语(2022秋)Unit 6 test

科技交流英语&#xff08;2022秋&#xff09;Unit 6 test 简介 由电子科技大学组织开设&#xff0c;授课教师为李京南、庞慧、刘兆林等5位老师。 课程介绍 英语广泛用于工程技术领域的国际交流。如何使用简洁的语言清楚地传递信息是工程师在国际舞台上常常面临的问题。本课…

【Vue】Vue重写教室管理系统的前端网页V1(前后端分离)--20221222

项目说明 目的 练习并熟悉Vue2 的API&#xff0c;来为Vue项目做准备&#xff1a; 插值语法插槽props和data父子组件通信Ajax异步请求数据生命周期函数methods方法computed属性vue-router、路由守卫、query/params传参、编程函数式路由模拟后端服务器传送数据打包项目 需要加…

Tableau可视化设计案例-06Tableau填充地图,多维地图,混合地图

文章目录Tableau可视化设计案例06 填充地图&#xff0c;多维地图&#xff0c;混合地图1.填充地图1.1 各省售电量填充地图 地图格式设置2.多维地图2.1 各省售电量多维地图3.混合地图3.1 各省售电量混合地图Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔…

如何花最少的资源遍历二叉树

文章目录一、递归遍历二叉树1.1 前序遍历1.2 中序遍历1.3 后序遍历二、非递归遍历二叉树2.1 前序遍历2.2 中序遍历2.3 后序遍历三、高效的 Morris 遍历3.1 前序遍历3.2 中序遍历3.3 后序遍历关于二叉树的遍历也是面试过程中非常有可能考的话题。常见的简单的递归遍历二叉树&…

头条号权重高有什么优势?头条权重在线查询

头条号权重是根据你的关键词排名、预估流量等综合评估计算出的一个"权重值"&#xff0c;关键词指数越大&#xff0c;排名越好&#xff0c;预估的流量就越多&#xff0c;权重也就越高。 如果是查询头条号权重较少&#xff0c;可以看看这3个方法&#xff1a; 1、指…

flutter 环境搭建

一、简介 Flutter 是谷歌开发的一款开源、免费的&#xff0c;基于 Dart 语言的U1框架,可以快速在i0S和Android上构建高质量的原生应用。 它最大的特点就是跨平台和高性能。Dart是由谷歌&#xff0c;在2011 年开发的计算机编程语言&#xff0c;它可以被用于Web、服务器、移动应…

腾讯云轻量应用服务器安装和配置宝塔 Linux 面板腾讯云专享版

宝塔 Linux 面板腾讯云专享版由腾讯云与堡塔公司联合开发&#xff0c;专享版在已支持普通版所有功能的基础上&#xff0c;还默认集成腾讯云对象存储、文件存储、内容分发网络和 DNS 解析插件。插件具备如下功能&#xff1a; 支持将对象存储的存储桶挂载到轻量应用服务器实例&a…

IDEA技巧:如何根据注释生成swagger注解

相信大家在进行java项目开发&#xff0c;肯定会接触到swagger的&#xff0c;一款动态生成api文档的神奇&#xff0c;只需要在api上面加上注解&#xff0c;就可以生成文档&#xff0c;现在我简单介绍下swagger的快速入门&#xff0c;最后再说下如何根据注释快速生成这些烦人的注…

(模板)矩阵乘法:斐波那契数列问题

在数学上&#xff0c;斐波那契数列以如下被以递推的方法定义&#xff1a; F(1)1&#xff0c;F(2)1, F(n)F(n-1)F(n-2&#xff09;&#xff08;n>3&#xff0c;n∈N*&#xff09;。 由以上推理公式&#xff0c;可以求得任何一项的斐波那契数列值。 弊端&#xff1a;斐波那…

UI自动化测试-pytest框架

在进行UI自动化测试的时候&#xff0c;我们需要工具来对测试用例进行收集&#xff0c;执行&#xff0c;标记&#xff0c;参数化。pytest就是这样一个工具。 pytest实际是python的一个单元测试框架&#xff0c;其他还有如unittest等&#xff0c;它可以实现按照规则搜索测试用例…

国产化服务环境中使用gunicorn部署Flask应用并配置开机自启

背景 服务端由第三方部署了一个基于 darknet &#xff08;一个较为轻型的完全基于C与CUDA的开源深度学习框架&#xff09;的识别算法服务&#xff0c;通过 Flask 的 Web 服务对业务服务暴露 API 接口。作为测试&#xff0c;一开始是直接通过 python3 app.py 的命令行启动的服务…

Ubuntu安装Anaconda详细步骤

本文主要讲述了在Ubuntu中安装anaconda的具体步骤。 准备环境&#xff1a;Ubuntu&#xff0c;Anaconda3 一、安装Anaconda3 在清华镜像下载Linux版本的anaconda&#xff1a; https://mirrors.bfsu.edu.cn/anaconda/archive/我选择的是Anaconda3-2022.10-Linux-x86_64.sh 下…

数组(7)

目录 1、一维数组 1、数组的创建 2、数组的初始化 3、一维数组的使用 4、一维数组在内存中的存储 2、二维数组 1、二维数组的创建 2、二维数组的初始化 3、二维数组的使用 4、二维数组在内存中的存储 3、数组越界 4、数组作为函数参数 1、冒泡排序&#xff1a; 5…

【学习笔记12.24】关于事务你必须知道的几件事

文章目录事务基础知识什么是事务&#xff1f;开启事务事务隔离级别事务基础知识 在MySQL中&#xff0c;只有InnoDB存储引擎是支持事务的。 什么是事务&#xff1f; 事务是逻辑操作的最小单元&#xff0c;使数据从一个状态转变为另一个状态。 也可以通过事务四大特性ACID来更…

SAP ERP 里的 Costing Sheet 成本核算表

有朋友在我的知识星球里向我提问&#xff1a; 请您帮忙讲一下这个AP0100的costing sheet rows这里都表示什么意思吗&#xff1f;比如row10、base Z010、overhead啥、描述、from、to row、credit都说明了什么&#xff0c;能够实现上面&#x1f446;&#x1f3fb;的目标吗&#x…

fpga实操训练(vga测试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我自己读书那会&#xff0c;买的电脑还是以台式机居多&#xff0c;平板显示器也是才刚刚流行、且价格较高&#xff0c;视频接口也是以VGA为主。不像…