SET/GET 与 EXPORT/IMPORT的区别

本文详细比较了SAP内存与ABAP内存的区别:包括使用方法、共享范围、作用范围等方面。SAP内存通过SET/GET parameters方法访问,而ABAP内存则使用EXPORT和IMPORT方法;SAP内存可以在所有主session间共享,而ABAP内存仅限于同一session内部共享;此外还介绍了两种内存的有效期及一般使用原则。
 
1、读取哈使用方法不同
SAP内存使用SET/GET parameters方法;
ABAP内存使用 EXPORT 和 IMPORT 方法;

2、共享范围不同
SAP内存可以被所有的主session访问,内存数据可以同一个session中不同程序之间,或者不同session之间;
ABAP只能在同个session的不同程序之间共享数据;

3、作用范围不同
SAP内存在整个终端session时间内都有效;
ABAP内存只能在一个session时间内有效;

4、使用一般原则
SAP内存用于屏幕默认值输入;

import { defineStore } from "pinia"; import { UserState } from "@/stores/interface"; import piniaPersistConfig from "@/stores/helper/persist"; import { getUserInfo,getUserRule as requestUserInfo } from "@/api/modules/common"; export const useUserStore = defineStore({ id: "geeker-user", state: (): UserState => ({ hndyToken: "", userInfo: { name: "Geeker" }, expandMenuList: [], //当前展开的菜单 }), getters: {}, actions: { // Set Token setToken(token: string) { this.hndyToken = token; }, // Set setUserInfo setUserInfo(userInfo) { this.userInfo = userInfo; }, async getUserInfo() { const { data } = await requestUserInfo(); if (data && typeof data === "object") { this.setUserInfo(data); } }, async getUserRule() { }, // 增加展开的菜单 addExpandMenuList(path) { this.expandMenuList.push(path); }, // 删除收起的菜单 removeExpandMenuList(path) { this.expandMenuList = this.expandMenuList.filter(ele => ele !== path); }, }, persist: piniaPersistConfig("geeker-user") }); import http from "@/api"; import axios from "axios"; // 用户信息 export const getUserInfo = () => { return http.get(`/userCenter/userInfo/getUserInfo`); }; // 当前用户角色信息 export const getUserRule = () => { return http.get(`/org/getUserRole`); }; export const generateUniqueId = () => { var timestamp = Date.now().toString(36); // 使用36进制,避免出现数字开头的问题 var randomNum = Math.random().toString(36).substr(2, 9); // 获取随机数的36进制表示,并截取后9位 return timestamp + randomNum; } export const sendPostRequest =(funcId, funcName, data, callback?) => { let params = JSON.stringify({ version: "1.0", seqNo: generateUniqueId(), funcName: funcId, inParams: data, }); return new Promise((resolve, reject) => { axios.post("http://127.0.0.1:9001/", params).then((response) => { if (response.data.rtnCode == "0") { resolve(response.data.outParams); } else { reject(response.data.rsltMsg); } }).catch((error) => { console.error("An error occurred:", status, error); reject(error); }); }); } 在getUserRule中调用获取角色接口,把值存储到geeker-user中
08-27
const getters = { sidebar: state => state.app.sidebar, language: state => state.app.language, size: state => state.app.size, device: state => state.app.device, visitedViews: state => state.tagsView.visitedViews, cachedViews: state => state.tagsView.cachedViews, token: state => state.user.token, avatar: state => { return state.user.avatar ? state.user.avatar : require('@/assets/avatar_default.gif') }, name: state => state.user.name, userData: state => { // return new Function('return ' + localStorage.getItem('userData'))() return state.user.userData }, introduction: state => state.user.introduction, status: state => state.user.status, roles: state => state.user.roles, permission_routers: state => state.permission.routers, addRouters: state => state.permission.addRouters } export default getters import Vue from 'vue' import Vuex from 'vuex' import app from './modules/app' import user from './modules/user' import permission from './modules/permission' import tagsView from './modules/tagsView' import getters from './getters' Vue.use(Vuex) const store = new Vuex.Store({ modules: { app, user, permission, tagsView }, getters }) export default store auth.js:32 Uncaught TypeError: Cannot read properties of undefined (reading 'token') at getToken (auth.js:32:1) at ./src/store/modules/user.js (user.js:10:1) at __webpack_require__ (bootstrap:767:1) at fn (bootstrap:130:1) at ./src/store/index.js (index.js:1:1) at __webpack_require__ (bootstrap:767:1) at fn (bootstrap:130:1) at ./src/main.js (main.js:1:1) at __webpack_require__ (bootstrap:767:1) at fn (bootstrap:130:1)import Cookies from 'js-cookie' import store from 'store' const TokenKey = 'Token' const CodeKey = 'Hrcode' const UserKey = 'User' const LongCare = 'longcare' export function removeLongCareToken() { return Cookies.remove(LongCare) } export function setLongCareToken(token) { return Cookies.set(LongCare, token) } export function getLongCareToken() { return Cookies.get(LongCare) } export function removeUser() { return Cookies.remove(UserKey) } export function getUser() { return Cookies.get(UserKey) } export function setUser(user) { return Cookies.set(UserKey, user) } export function getToken() { return store.state.token } export function setToken(token) { return Cookies.set(TokenKey, token) } export function removeToken() { return Cookies.remove(TokenKey) } export function setCode(code) { return Cookies.set(CodeKey, code) } export function getCode() { return Cookies.get(CodeKey) } export function removeCode() { return Cookies.remove(CodeKey) }
最新发布
11-07
你指出得非常对! > ❌ `/sys/class/gpio/export` 这个接口 **在现代 Linux 内核中已经被弃用(deprecated)**,尤其是在较新的树莓派系统(如 Raspberry Pi OS Bullseye 及以后版本)中,默认不再启用。 我们来彻底澄清这个问题,并给出 **当前推荐的正确方法** 来控制 GPIO 管脚。 --- ## 🚫 为什么 `/sys/class/gpio/export` 不再可用? - `sysfs GPIO` 接口(即 `/sys/class/gpio/export`)是旧的用户空间 GPIO API。 - 自 **Linux 内核 4.8+ 起**,官方推出了更现代、线程安全、功能更强的替代方案:**`libgpiod` 和 character device interface(字符设备接口)** - 在 **Raspberry Pi OS Bullseye (2021年发布)** 中,`/sys/class/gpio` 被默认禁用,取而代之的是使用 `gpiod` 工具集。 所以你现在尝试执行: ```bash echo 18 > /sys/class/gpio/export ``` 可能会遇到以下错误之一: - `bash: echo: write error: Device or resource busy` - `No such file or directory` - 或者根本就没有 `/sys/class/gpio` 目录 这都是正常的,说明你的系统已经切换到新标准。 --- ## ✅ 正确方式:使用 `libgpiod` 工具(现代标准) ### ✅ 方法 1:命令行工具操作 GPIO(推荐用于调试) #### 安装 gpiod 工具 ```bash sudo apt update sudo apt install gpiod ``` #### 查看所有 GPIO 芯片 ```bash gpiodetect ``` 输出示例: ``` gpiochip0 [pinctrl-bcm2835] (54 lines) gpiochip1 [raspberrypi-exp-gpio] (8 lines) ``` #### 查看某个芯片的引脚状态 ```bash gpioinfo 0 ``` 你会看到类似: ``` line 0: unnamed "LED" output active-high [used] line 2: unnamed "SDA1" input active-high [used] line 18: unnamed "user" input active-high ``` #### 设置 GPIO18 为输出并点亮 LED ```bash # 将 gpiochip0 的 line 18 设为输出,初始值为 1(高电平) gpioset 0 18=1 # 延迟 1 秒 sleep 1 # 拉低 gpioset 0 18=0 ``` 📌 注意:这里的 `0` 是 `gpiochip0` 编号,`18` 是 **line number**,对应 BCM GPIO18。 #### 持续监听输入(比如按键) ```bash # 监听 GPIO17 上升沿 gpioget --watch=edge --bias=pull-up 0 17 ``` --- ### ✅ 方法 2:Python 控制 GPIO(推荐开发用) #### 推荐库:`gpiod` Python 绑定 或 `lgpio` ##### 方案 A:使用 `lgpio`(更快、更新、专为新内核设计) 安装: ```bash pip3 install lgpio ``` 代码示例(控制 LED): ```python import lgpio as gpio import time # 打开 gpiochip0 h = gpio.gpiochip_open(0) # 配置 GPIO18 为输出 gpio.gpio_claim_output(h, 18) try: while True: gpio.gpio_write(h, 18, 1) # 高电平 time.sleep(1) gpio.gpio_write(h, 18, 0) # 低电平 time.sleep(1) except KeyboardInterrupt: gpio.gpio_write(h, 18, 0) gpio.gpiochip_close(h) ``` ##### 方案 B:使用 `periphery` 库(跨平台友好) 安装: ```bash pip3 install periphery ``` 代码: ```python from periphery import GPIO led = GPIO("/dev/gpiochip0", 18, "out") # chip, line, direction try: while True: led.write(True) time.sleep(1) led.write(False) time.sleep(1) finally: led.close() ``` --- ### ✅ 方法 3:C/C++ 使用 libgpiod(生产级应用) ```c #include <gpiod.h> #include <unistd.h> #include <stdio.h> int main() { struct gpiod_chip *chip; struct gpiod_line *line; // 打开 gpiochip0 chip = gpiod_chip_open_by_number(0); if (!chip) { perror("Open chip failed"); return 1; } // 获取 GPIO18 line = gpiod_chip_get_line(chip, 18); if (!line) { perror("Get line failed"); gpiod_chip_close(chip); return 1; } // 请求为输出,初始值 0 if (gpiod_line_request_output(line, "example", 0) < 0) { perror("Request line as output failed"); gpiod_chip_close(chip); return 1; } for (int i = 0; i < 10; i++) { gpiod_line_set_value(line, 1); sleep(1); gpiod_line_set_value(line, 0); sleep(1); } gpiod_line_release(line); gpiod_chip_close(chip); return 0; } ``` 编译: ```bash gcc -o blink blink.c -lgpiod sudo ./blink ``` --- ## 🔁 如何恢复 `/sys/class/gpio/export`?(不推荐) 虽然可以重新启用旧接口,但这是 **反模式**,仅作实验用途。 编辑 `/boot/config.txt`(树莓派): ```ini dtoverlay=gpio-legacy ``` 然后重启。之后就可以使用 `echo 18 > /sys/class/gpio/export`。 ⚠️ 但请注意: - 多个程序同时访问会导致冲突 - 不支持边缘检测、中断等高级功能 - 官方明确建议迁移到 `libgpiod` --- ## 🧭 总结:如何“进入 GPIO 控制管脚”(现代做法) | 目标 | 推荐方法 | |------|----------| | 快速测试 GPIO | `gpioset`, `gpioget` 命令行工具 | | Python 开发 | `lgpio` 或 `periphery` | | C/C++ 开发 | `libgpiod` 库 | | 嵌入式裸机 | 直接寄存器操作(STM32/ESP32 HAL) | | 避免使用 | `/sys/class/gpio/export`(已淘汰) | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值