c语言基础知识+OS+数据结构

news2024/11/24 19:33:37

c语言:

memory section:

.bss

.data

.text

C语言编译流程:

pre-compiler: 

compiler: 检查语法问题

link: 将symbol转化为实际函数/变量地址,map file里面可以看到

预编译在做什么: (#define)

【C语言关键字 / keyword】

Macro写一个函数: Macro本质就是pre-processor将内容进行文本替换

typedef 和 macro哪个好

const的含义

volatile的含义

const 和 volatile公用

对固定地址赋值

extern: change visible scope

static 修饰

全局变量:  visibility 

局部变量

函数

sizeof (sizeof也是个keyword): 返回的是byte数

sizeof(int)

sizeof(Node)            //typedef struct{} Node;


 

【位操作】

&

|

^  (exclusive or)

~

【数据类型】

数组

字符和字符串

结构体

union

data alignment: data will be padding

指针

void

wild

NULL 

dangling 

typecasting:

int will be promoted to unsigned int

队列

链表

 【库函数】

strlen(const char* str);


void* malloc(size_t size);
void free(void *ptr);



void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));



【恶心的】

auto:  default storage class, for local variable 【storage duration is automatic,be created when the program execution enters the block in which it is defined and destroyed when the block exits】

register:  only for local variables, store in cpu register instead of RAM 【& cannot be used on register variable】

enum:

bit field:

switch case:

Exp1 ? Exp2 : Exp3;

i++ / ++i

0xFF

0b011

%s

%d

%f

char  1bit

short 2bit

int:  4 bytes

short vs long:8 bytes

double: 

float: 

runtime error:  X is local variable

OS:

【核心】

basic/extended task:

  • basic task: 在running状态下,只有terminate和被更高优先级任务抢占,进入ready状态两种 释放cpu的方式 【不涉及等待共享资源的简单任务】【反正我看到的AUTOSAR project里面都是extended task】
  • extended task:在running状态下,有主动释放cpu,进入wait状态的能力【等待共享资源的释放】

deadlock:

前提: 有两个共享的resource A和 B,task 1和2 都需要 A和B 两个资源

task1使用了resource A,然后被task2抢占,task使用了resource B,然后发现resource A不可用,于是进入wait 模式【此时B没有被释放】。 task1拿回cpu控制权继续执行,然后发现 resource B不可用,互相wait

解决: timeout,如果等待时间timeout以后,task需要释放自己的resource

优先级反转:  

Priority Inversion

前提:有一个共享的resource  【优先级3>2>1】

优先级1的task 被 优先级3的task抢占,但task3在执行过程中发现share resource不可用【被task1用着呢】,于是释放了cpu【进入wait,任务就绪表置0,触发scheduler】,scheduler根据任务就绪表让task1继续执行,但此时task2又抢占了task1并执行完成,

解决:临时提升低优先级任务的优先级。 task3在因为resource释放cpu的时候,把持有resource的task1优先级临时提升到3,这样task2 就不能抢占他了

【因为basic task中没法处理share resource,所以只有extended task需要考虑deadlock 和优先级反转】

ECU多核之间通讯:

多核间通讯:  IOC, spinlock

就一个core,task发现resource 不能用的时候,就只应该立刻释放cpu 【mutex + semaphore

多核的时候,才有一个core 来while(1),等待另一个core的task运行完release resource的道理【spinlock】

因为spinlock用于多核cpu,其中一个core一直while(1)等待另一个core释放资源,也无所谓 【Spin locks are a low-level synchronization mechanism suitable primarily for use on shared memory multiprocessors. When the calling thread requests a spin lock that is already held by another thread, the calling thread spins in a loop to test if the lock has become available】

进程间通讯:

mutex VS semaphore

都是用来做进程间同步的,区别是mutex必须是进程自己释放,semaphore可以是别的进程释放,而且可以大于1

  • mutex: 主要的purpose是protect shared resources
  • semaphore: 主要的purpose是notice一个event已经发生了,比如taskA 在等一个semaphore,然后一个传感器触发了ISR,ISR去把semaphore置1了,然后taskA就可以继续执行了,这就是为什么说semaphore可以是别的进程释放

semaphore: 【由计数器和 任务等待表 两部分组成,也就是说每个信号量都有自己的任务等待表】

  1. 如果信号量的值为0,任务进入wait状态,并在任务等待表上面被标记,然后触发scheduler
  2. 当其他任务释放了信号量后,会在该信号量的任务等待表中找到最高优先级的任务,并将其从wait转为ready状态,然后触发scheduler

所以scheduler的工作很简单,在任务就绪表里面找最高优先级的任务【有更高的就上下文切换】

  • 想让任务wait,并交出cpu控制权很简单:把它在任务就绪表自己的格子中置0,在任务等待表中置1,然后触发scheduler即可
  • 想让任务从wait到ready,更简单:把它在任务就绪表自己的格子中置1,在任务等待表中置0,然后触发scheduler即可

说白了extended task,就是task可以【因为共享资源不可用】主动放弃cpu控制权,进入wait状态,让优先级低的先去执行【任务就绪表置0,任务等待表置1】

basic task,task没法自己主动放弃cpu,只能是被动的被其他优先级更高的抢占

任务调度的原理:

scheduler被调用的场景:

  1. timer ISR调用scheduler【周期性的任务切换】
  2. task结束,调用scheduler
  3. extended task因为share resource不可用,放弃cpu进入wait状态,然后触发scheduler

任务就绪表【1张】  + 任务等待表【多张,每个信号量都有自己的1张任务等待表,信号量在被task释放的时候,该task会去该信号量的任务等待表唤醒最高优先级的任务进入任务就绪表,然后触发一次scheduler】

scheduler做的事情:

查找任务就绪表优先级最高的任务,如果需要切换,就context switch切换。否则就继续执行当前任务,开销很小

【杂项】

big/little endian

针对超过一个byte的数据而言。most significant byte在低地址的为big endian

检测方法:

int a = 0x12345678;

char *p = (char*)&a;    //(char*) 告诉编译器用char类型来解析a地址的数据



注:
通过char型指针p变量,获取第一个byte,既可判断

inline 函数

a suggestion to the compiler that it should generate code for the function at the call site, instead of generating a separate function call. for better performance

only a suggestion, compiler will make the final decision 

include <> 和 “” 的区别

<>: 寻找 system path(编译器的安装目录文件夹)

"":  寻找当前project path(当前工程文件夹),找不到再找system path

上电流程/startup phase 

【以下针对嵌入式MCU而言】

单核:

  • reset vector
  • startup code
    • init clock
    • memory setup: copy from FLASH to RAM + init stack pointer(stack信息在linker里面定义的 .lsl文件) (.bss .data 会在 RAM运行, .text还是在FLASH运行)
    • init peripheral: init GPIO, CAN (如果需要bootloader功能的话)
    • system init: 中断向量表初始化,enable 中断
  • main()

【linker里面配置了stack的大小,startup phase把stack pointer指向了该位置, 之后main函数入的就是这个栈。只是说操作系统在任务切换的时候,会把cpu register内该task的信息copy到那个task自己的任务控制块里面零时存起来,保护现场。之后再copy回来,就等于恢复现场,可以继续运行了】

【对于操作系统,每个task都要有自己的任务栈,运行的时候,cpu的stack pointer要指过去,是为了方便任务切换。如果所有task公用一个栈,假如task1先入栈运行,然后被优先级更高的task2抢占,入栈到它上面,然后task2运行一半休眠了,那么就没法access到task1的栈内容了。就算你把task2的栈pop出来去存储,也太麻烦了,消耗时间太多】

多核:

  • 硬件启动master core0, core0去唤醒slave core1,2,3 。【唤醒的含义是硬件初始化+startOS】 在所以核心的OS start以后,会进行第一次同步。 
  • 第一次同步后,各个core会去call application startup hook,然后进行第二次同步。从而确保所有core的OS kernel一起开始运行。
  • 【第一次同步是OS 初始化完成(OS的stack什么的)【EcuM startupOne】,第二次同步是进程初始化完成(OS-Application,Task的堆栈,控制块初始化等等)【EcuM startupTwo】,然后同时开启时间片进行Task调用】

中断向量表:

中断向量表网站链接:(array of function pointers)

  • 一个用来存储各个中断服务函数地址的内存区域
  • 中断向量表区间默认是空着的
  • 用户在c文件里面创建了ISR函数,那么MCU上电的时候,startup code就要根据用户创建的各个ISR的地址,把这些函数地址都注册到 中断向量表 里面
  • 中断向量表在code/FLASH section

Interrupts and exceptions:

  • interrupt: trigger by external event, save context and jump to the ISR

  • system exceptions: trigger by cpu (divided by zero, invalid memory access), save context and jumps to an exception handler routine

下图可以看到,Interrupts and exceptions 都在 中断向量表里面

抢占式: (Preemptive)

  1. Preemptive OSes are often used in real-time systems where tasks must meet strict deadlines. The OS can guarantee that high-priority tasks will run when required.

  2. some preemptive OSes use time slicing, where each task is given a fixed time quantum to run. When the time quantum expires, the task is preempted even if it hasn't finished.

函数入栈流程:

函数入栈流程网站链接:

函数栈从高地址到低地址增长

return address, actual parameters and local variable are pushed into stack【返回地址就是下一行该执行的代码的地址】

ebp, esp  stands for base pointer and stack pointer

一道很好的题目

call by value/reference:

  • by value: a copy of the actual argument's value is passed to the function, any changes made to the parameter (in the function) do not affect the original argument
  • by reference: pointer to the actual argument is passed to the function, It is useful when you want a function to modify the original data

actual and formal parameters:

  • formal: variables or placeholders that are declared as part of a function's definition

  • actual: the values  passed to a function when it is called

context switch:

save the current status of task into control blocks 【register, task stacks】

trigger by interrupt, pre-emptive multi-task, 

reentrant function 

  • can be safely called simultaneously by multiple threads, 
  • Reentrant functions use only local data (variables or memory) and do not rely on global or shared data, do not use static variables

#pragma

memory mapping 的时候,用到过

  • variable placement:
  • code section placement: 

原码,反码,补码

正数的原码,反码,补码都一样

负数的原码:和正数一样,除了符号位置1 【问题,正负数原码相加不为0】

反码(ones' complement):直接把正数的原码反过来【问题,正负数反码相加为0xFFFF】

补码(twos' complement):反码+1 【正负数补码相加不为0】

虚拟内存: paged memory

数据结构:

位操作: 

数组操作:

指针:

qsort

链表:

malloc

free

stack:

queue:

递归: 

冒泡算法:

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

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

相关文章

Unity3D C# 反射与特性的配合使用

需求分析 情况&#xff1a; 假如我们是一个动物园的管理员&#xff0c;我们需要统计园内的所有动物和动物的行为。 举例&#xff1a; 现在园区内有猫、狗和鸡。猫对应的行为是喵喵喵和卖萌&#xff0c;狗对应狗吠和干饭&#xff0c;鸡对应篮球和打鸣那么这时候我要统计这些&a…

【开发】视频监控系统/视频汇聚平台EasyCVR平台页面展示优化

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

怎么绘制骑鹅旅行记思维导图?教你这样绘制

怎么绘制骑鹅旅行记思维导图&#xff1f;骑鹅旅行记是一本经典的童话故事&#xff0c;绘制这个故事的思维导图可以帮助我们更好地理解故事情节和角色关系。那么今天就给大家介绍一种快速且简便的方法来绘制思维导图。 我们可以使用【迅捷画图】来进行制作&#xff0c;这是一种功…

深度学习笔记之优化算法(一)铺垫:梯度下降法VS最速下降法

深度学习笔记之优化算法——铺垫&#xff1a;梯度下降法VS最速下降法 引言回顾&#xff1a;条件数范数 相关描述关于梯度下降法最速下降法单位范数的描述 梯度下降法VS最速下降法梯度下降法等价于最速下降法的情况欧式范数约束产生的更新方向可能不是最优方向梯度下降法与最速下…

RayViz 一款服务于SolidWorks用于光学和机械设计的有效工具

RayViz 作为 SolidWorks 的一个扩展插件&#xff0c;不仅可以在 SolidWorks 工作环境中直接定义和保存模型光学属性&#xff0c; 而且还可以在该 CAD 工作环境中直接进行光线追迹。通过 RayViz, 把 TracePro 和 Solidworks 链接了起来&#xff0c; 一个模型可以在 TracePro 中用…

14.抽象工厂模式

UML 代码 #include <iostream> #include <list> using namespace std;class AbstractProductA { public:virtual void showa() 0; }; class ProductA1:public AbstractProductA { public:virtual void showa(){cout << "我是A1" << endl;}…

OpenHarmony Meetup常州站招募令

OpenHarmony Meetup 常州站正火热招募中&#xff01; 诚邀充满激情的开发者参与线下盛会~ 探索OpenHarmony前沿科技&#xff0c;畅谈未来前景&#xff0c; 感受OpenHarmony生态构建之路的魅力&#xff01; 线下参与&#xff0c;名额有限&#xff0c;仅限20位幸运者&#xff01…

【c++_containers】string的模拟实现

前言 在学习数据结构时&#xff0c;如何证明自己彻底掌握了一个容器的各种特性&#xff1f;最直接的办法就是自己写一个。下面我们将围绕下图展开对与string的深度了解&#xff1a; 一.string的成员变量 string是表示字符序列的对象&#xff0c;同时增加了专门用于操作单字节字…

2023Node.js零基础教程(小白友好型),nodejs新手到高手,(一)NodeJS入门

写在开始前 在无尽的代码汪洪中&#xff0c;闪耀着一抹绚丽的光芒。它叫做Web前端开发&#xff01; HTML是我们的魔法笔&#xff0c;是创造力的源泉。它将我们的思绪化为标签&#xff0c;将我们的想象变为元素。 在无尽的标签组合中&#xff0c;我们创造出独特的网页&#xff…

分享:大模型定向培养学徒来啦

模型定向培养学徒招募对象&#xff1a; 1.在读研究生学硕专硕均可 2.大数据、人工智能、统计学计算机、软件、数学等相关研究方向 3.具备Python编程基础机器学习基础 4.有深度学习自然语言处理基础优先 大模型定向培养学徒目标&#xff1a; 1.培养大模型prompt能力&#…

位图(bitmap)原理以及实现

大家好&#xff0c;我是蓝胖子&#xff0c;我一直相信编程是一门实践性的技术&#xff0c;其中算法也不例外&#xff0c;初学者可能往往对它可望而不可及&#xff0c;觉得很难&#xff0c;学了又忘&#xff0c;忘其实是由于没有真正搞懂算法的应用场景&#xff0c;所以我准备出…

Linux搭建Apache(秒懂超详细)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

C++ Primer (第五版)第一章习题部分答案

在我自学C过程中&#xff0c;我选择了CPrimer这本书&#xff0c;并对部分代码习题进行了求解以及运行结果。接下来几个月我将为大家定时按章节更新习题答案与运行结果: 目录 1.9编写程序,使用while循环将50到100的整数相加 1.10 除了运算符将运算对象的值增加1之外,还有一个…

leetcode522. 最长特殊序列 II(java)

最长特殊序列 题目描述枚举法代码演示 题目描述 难度 - 中等 leetcode522. 最长特殊序列 II 给定字符串列表 strs &#xff0c;返回其中 最长的特殊序列 的长度。如果最长特殊序列不存在&#xff0c;返回 -1 。 特殊序列 定义如下&#xff1a;该序列为某字符串 独有的子序列&a…

【STM32】IWDG—独立看门狗

基于stm32f103 基于《零死角玩转STM32—F103指南者》 一个12bit的递减计数器 STM32 有两个看门狗&#xff0c;一个是独立看门狗另外一个是窗口看门狗&#xff0c;独立看门狗号称宠物狗&#xff0c;窗口看门狗号称警犬。 独立看门狗是一个 12 位的递减计数器&#xff0c;当计…

数字孪生:助力机载软件构型管理

飞机机载软件具有研发周期长、版本更新频繁、相关工程资料密集等特性。由于各个系统的软件分别由不同供应商开发&#xff0c;其设计保障等级、设计架构、实现方法等方面都各有不同&#xff0c;对机载软件进行高效、规范的构型管理显得尤为重要。 Q&#xff1a;什么是构型管理&…

【张兔兔送书第一期:考研必备书单】

考研书单必备 《数据结构与算法分析》《计算机网络&#xff1a;自顶向下方法》《现代操作系统》《深入理解计算机系统》《概率论基础教程&#xff08;原书第10版》《线性代数&#xff08;原书第10版&#xff09;》《线性代数及其应用》赠书活动 八九月的朋友圈刮起了一股晒通知…

Idea新建项目配置Java3D 环境配置

&#xff08;一&#xff09;JDK配置 安装包的下载&#xff1a;1.可以去官网&#xff1a;JDK下载&#xff0c;进入官网页面Java Downloads | Oracle&#xff0c;然后点击Download Java。2.搜博客&#xff0c;可能会内含安装包链接。 ​ 2.在这个界面可以选择我们要安装的版本…

IEEE802.2之LLC(逻辑链路控制)

一、概念 IEEE 802.2 是一种用于局域网&#xff08;LAN&#xff09;和都会区域网&#xff08;MAN&#xff09;的数据链路层逻辑链路控制&#xff08;LLC&#xff09;的标准。它是 IEEE 802 系列标准中的一个组成部分&#xff0c;专门用于定义如何在数据链路层内进行帧的多路复用…

按摩软件仿东郊到家系统开发,上门预约系统;

按摩软件仿东郊到家系统开发&#xff0c;上门预约系统&#xff1b; 用户端、技师端、商家端&#xff0c;以及管理后台。上门预约的操作 1、技师管理。 技师满意度进行统一跟踪评估&#xff0c;进行分级管理&#xff0c;分级评估&#xff1b; 2、订单管理。 按订单状态分类筛选&…