sed的&操作符+复盘和把经验转化为能力+sed替换关联环境变量+SystemC+C++的struct和class+C语言嵌入多行汇编+Makefile定义命令包+dump fsdb波形
sed命令操作
sed的&操作符
sed一般是按行操作,如果匹配到,那么匹配到的内容被表示为&。
以下是在单行操作中,想要实现在某行数据特定字符前后插入字符的方法。
sed替换关联环境变量
环境变量参与到变量的替换过程中:
(使用双引号)
CHAR=B
echo -e "A\nBC\nCD" | sed "s/C/$CHAR/g"
如果环境变量中掺杂了斜杠(如路径),则需其它处理(将原来的分割符用@替代即可),否则(包含了斜杠sed: -e expression #1, char xxx: Unknown option to) :
sed 's@xxx@'"$PWD"'@'
sed使用拓展正则进行分组替换
增加 -r
sed -r -i 's/(PASS_MAX_DAYS)\s+([0-9]+)/\1 90/' /etc/login.defs
复盘和把经验转化为能力
https://www.163.com/dy/article/GEI2Q9EN05429MRP.html
通过寻找和尝试新的做事方式,你才能提高自己的能力。这需要努力和专注,没有这两种成分,任何技能都很难提高。那怎么改进呢?自我评估,以及反思每次练习结束后的情况,并思考下次改进的方法都是比较有效的方法。任何感觉太容易的事情,可能都是你已经知道如何去做的事情,而且你不太可能从中学到很多东西。
《复盘=把经验转化为能力》
SystemC
https://systemc.org/overview/systemc/
划分了不同的功能模块。
其中的事务级建模(TLM)实现了模型的最佳重用和跨不同用例的建模工作。
SystemC Analog/Mixed-Signal (AMS)在设计抽象的更高层次上为嵌入式模拟/混合信号应用的设计和建模提供了独特的功能。
Configuration, Control and Inspection (CCI)用于配置、控制和检查(CCI)的目标是提高模型创建者和工具提供者的效率和ROI。
SystemC Verification(UVM-SystemC, SCV)UVM-SystemC库在SystemC中提供了通用验证方法(UVM)的实现。
UVM-SystemC类库支持为系统级验证和测试开发可伸缩和可重用的验证附属品。
SystemC Verification (SCV)库提供了一组通用的api,这些api被用作验证SystemC活动的基础(在约束条件下生成值、事务记录等)。
sc_bv
https://blog.csdn.net/zgcjaxj/article/details/123768443
sc_bv 是 bit vector的简称,在namespace sc_dt (data types)中定义。sc_bv继承于sc_bv_base,sc_bv_base继承于sc_proxy<sc_bv_base>。sc_bv是一个模板类,定义时需要传入一个int参数,表示位宽。
sc_lv
https://blog.csdn.net/denlee/article/details/5686954
局部变量可以初始化为全'X'或全'Z',如sc_lv<8> temp('X');
C++的struct和class
struct中定义的函数和变量
https://blog.csdn.net/ucasliyang/article/details/52691619
struct中定义的函数和变量都是默认为public的,但class中的则是默认为private。
#include<iostream>
#include<string>
struct Person
{
Person(std::string name);
std::string greet(std::string other_name);
std::string m_name;
};
Person::Person(std::string name)
{
m_name = name;
}
std::string Person::greet(std::string other_name)
{
return "Hi " + other_name + ", my name is " + m_name;
}
int main()
{
Person m_person("JANE");
std::string str = m_person.greet("JOE");
std::cout<<str<<std::endl;
}
struct构造函数中的冒号
https://www.cnblogs.com/pengyingh/articles/10405173.html
构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。
struct _XXX{
_XXX() : y(0xc0) {}
};
C++ 类可以从多个类继承成员
继承使用冒号,各个基类之间用逗号分隔
https://www.runoob.com/cplusplus/cpp-inheritance.html
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
c++的class之间的相互继承关系
https://c.biancheng.net/view/2269.html
-
public继承方式
● 基类中所有 public 成员在派生类中为 public 属性;
● 基类中所有 protected 成员在派生类中为 protected 属性;
● 基类中所有 private 成员在派生类中不能使用。 -
protected继承方式
● 基类中的所有 public 成员在派生类中为 protected 属性;
● 基类中的所有 protected 成员在派生类中为 protected 属性;
● 基类中的所有 private 成员在派生类中不能使用。 -
private继承方式
● 基类中的所有 public 成员在派生类中均为 private 属性;
● 基类中的所有 protected 成员在派生类中均为 private 属性;
● 基类中的所有 private 成员在派生类中不能使用。
struct和class相互继承时,默认的继承方式
https://codeantenna.com/a/GD0A0GiBeZ
(派生struct则为public。派生class则为private)
基类是struct,派生类也是struct,默认的继承方式是public的;
基类是class,派生类也是class,默认的继承方式是private的。
基类是struct,派生类是class,默认的继承方式是private的
基类是class,派生类是struct,默认的继承方式是public的
C语言嵌入多行汇编
在自旋锁的实现层面,是使用event(类似但是和中断不同的方式),实现cpu进入一个低功耗和被唤醒的方式,实现锁的操作。
https://tinylab.org/arm-wfe/
例子如给上自旋锁:
static inline void arch_spin_lock(arch_spinlock_t *lock)
{
unsigned long tmp;
u32 newval;
arch_spinlock_t lockval;
prefetchw(&lock->slock);
__asm__ __volatile__(
"1: ldrex %0, [%3]\n"
" add %1, %0, %4\n"
" strex %2, %1, [%3]\n"
" teq %2, #0\n"
" bne 1b"
: "=&r" (lockval), "=&r" (newval), "=&r" (tmp)
: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
: "cc");
while (lockval.tickets.next != lockval.tickets.owner) {
wfe();
lockval.tickets.owner = READ_ONCE(lock->tickets.owner);
}
smp_mb();
}
Makefile定义命令包
https://blog.csdn.net/gsjthxy/article/details/106849165
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
foo.c : foo.y
$(run-yacc)
dump fsdb波形
编译添加:+vcs+fsdbon
仿真添加: +fsdbfile+signal.fsdb
Le vent se lève! . . . il faut tenter de vivre!
Le vent se lève! . . . il faut tenter de vivre!