面试(十)

news2024/11/24 8:43:10

目录

一. 单元测试

二. FreeRTOS和裸机哪个实时性好?

三. 怎么判断某个程序的运行时间

四. 函数指针

五. 全局变量被线程使用冲突

5.1 使用互斥锁

5.2 使用读写锁 

5.3 使用原子操作

六. 局部变量没有初始化是什么值

七. uint_8 n = 255 , n++等于多少

八. 临界区

九. STM32使用串口,dma

十. keil中如何查看代码大小

10.1 Code,包含两部分,即代码和数据

10.2  RO Data: read-only data,只读的数据

10.3  RW Data: read write data,可读写的数据

10.4 ZI Data: zero initialized data,零初始化的可读写变量

十一. volatile的作用,举例

十二. STM32F407VGT6的FLASH和SRAM大小

十三. 联合体什么时候用的着

十四. 结构体对齐

十五. 软硬件分离

十六. freertos中一般一个任务创建多大栈


一. 单元测试

"单元"指的是软件中最小的可测试部分,通常是一个函数:方法或类。它是程序的一个独立功能模块,能够接收输入并返回输出。

二. FreeRTOS和裸机哪个实时性好?

实时:系统能够在严格的时间限制内响应事件和处理任务

Freertos可以实现实时是因为

1. 优先级调度        FreeRTOS允许开发者为每个任务设置优先级,确保关键任务能够在需要时及时执行

2. 低延迟上下文切换

3. 中断管理

4. 任务间通信机制

三. 怎么判断某个程序的运行时间

看门狗用于监控程序的运行状态,确保程序在规定的时间内正常执行。

看门狗的基本实现思路:

定期喂狗:在程序的关键执行路径中定期重置看门狗计数器,以表示程序运行正常

超时处理:如果在规定的时间未重置看门狗,触发相应的故障处理机制

四. 函数指针

函数指针是指向函数的指针变量,它允许你在运行时动态调用函数。

#include <stdio.h>

void process(int (*func)(int), int value) {
    printf("Result: %d\n", func(value));
}

int square(int x) {
    return x * x;
}

int doubleValue(int x) {
    return x * 2;
}

int main() {
    process(square, 5);      // 输出: Result: 25
    process(doubleValue, 5); // 输出: Result: 10

    return 0;
}

五. 全局变量被线程使用冲突

多个线程可以同时访问和修改同一变量

5.1 使用互斥锁

#include <stdio.h>
#include <pthread.h>

int global_var = 0;
pthread_mutex_t mutex;

void* thread_function(void* arg) {
    pthread_mutex_lock(&mutex); // 加锁
    global_var++;
    printf("Global var: %d\n", global_var);
    pthread_mutex_unlock(&mutex); // 解锁
    return NULL;
}

int main() {
    pthread_t threads[10];
    pthread_mutex_init(&mutex, NULL); // 初始化互斥锁

    for (int i = 0; i < 10; i++) {
        pthread_create(&threads[i], NULL, thread_function, NULL);
    }

    for (int i = 0; i < 10; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_mutex_destroy(&mutex); // 销毁互斥锁
    return 0;
}

5.2 使用读写锁 

如果读操作远多于写操作,可以使用读写锁来提高性能。读写锁允许多个线程同时读取,但在写入时会被锁定

5.3 使用原子操作

原子操作是指在多线程或并发环境中,某个操作要么完全执行,要么完全不执行,无法被中断。

"原子操作"这个术语源于物理学中的"原子"概念,意为不可分割的最小单位,不可拆分。

六. 局部变量没有初始化是什么值

局部变量未初始化时,其值是未定义的,使用之前应确保进行初始化。

如果你尝试打印一直为0,可能原因:

内存清零:某些开发环境在调试模式下可能会自动将局部变量初始化为0

程序逻辑:在使用局部变量之前进行了其他操作,可能会影响到打印的值

七. uint_8 n = 255 , n++等于多少

回绕到0

八. 临界区

指一个代码段,在这个段内,访问共享资源时必须防止被其他任务中断

九. STM32使用串口,dma

#include "stm32f4xx_hal.h"

UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_DMA_Init(void);

void MX_DMA_Init(void) {
    // 初始化 DMA 控制器时钟
    __HAL_RCC_DMA2_CLK_ENABLE();

    // 配置 DMA
    hdma_usart1_rx.Instance = DMA2_Stream5;
    hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; // USART1 对应的 DMA 通道
    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; // 从外设到内存
    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址不增
    hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; // 内存地址增
    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐
    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 内存数据对齐
    hdma_usart1_rx.Init.Mode = DMA_CIRCULAR; // 循环模式
    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH; // 高优先级
    HAL_DMA_Init(&hdma_usart1_rx);

    // 将 DMA 与 USART 关联
    __HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx);
}

void MX_USART1_UART_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart1);
}

十. keil中如何查看代码大小

10.1 Code,包含两部分,即代码和数据

- code,即程序代码部分
- inline data. For example, literal pools(文字常量池), and short strings(短字符串)等. 这个一般被忽略,请大家注意!!!
- 代码段,存放程序的代码部分。

10.2  RO Data: read-only data,只读的数据

10.3  RW Data: read write data,可读写的数据

10.4 ZI Data: zero initialized data,零初始化的可读写变量

十一. volatile的作用,举例

告诉编译器某个变量可能会在程序的其他地方被意外修改

硬件寄存器:当变量映射到硬件寄存器,硬件可能会在没有程序明确操作的情况下改变这些值。

十二. STM32F407VGT6的FLASH和SRAM大小

FLASH大小为1024Kbytes,SRAM大小为192Kbytes

十三. 联合体什么时候用的着

允许在同一内存位置存储不同的数据类型,但在任意时刻只能用一个类型

节省内存:需要在同意内存区域存储不同类型的数据,但只在某一时刻使用其中之一,联合体可以节省内存

不同数据格式的表示:当数据需要以不同的格式进行处理时,可以使用联合体

十四. 结构体对齐

是指结构体中各个成员变量在内存中的排列方式。对齐通常是取决于最大成员的对齐要求

十五. 软硬件分离

使用硬件抽象层,将硬件特性封装在库中,让上层应用程序通过统一的接口与硬件进行交互。这样,应用程序与硬件实现相互独立。

十六. freertos中一般一个任务创建多大栈

简单任务:对于简单的任务,例如处理轻量级的信号或周期性任务,通常可以使用较小的栈,例如 128 字节到 256 字节。

中等复杂任务:对于需要处理一些数据或进行复杂计算的任务,建议使用 512 字节到 1024 字节的栈。

复杂任务:对于需要大量局部变量、递归调用或使用复杂数据结构的任务,栈大小可能需要更大,例如 2048 字节或更多。

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

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

相关文章

利基营销:如何为小众受众制定内容营销策略?AIGC大模型创新思维数字化转型商业模式专家培训讲师谈短视频内容社私域数字经济人工智能

了解利基营销 什么是利基营销&#xff1f; 简单来说&#xff0c;利基营销就是专注于特定范围的潜在客户群&#xff0c;而不是针对广泛的人群。 实际上&#xff0c;利基营销可以比作为拥有露营装备的人而不是所有热爱户外活动的人定制内容。露营爱好者会欣赏专门针对他们的需…

最佳实践(1)

1.Java 集合概览 Java 集合&#xff0c;也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Collection 接口&#xff0c;下面又有三个主要…

Windows 11 企业版LTSC 2024正式发布(附链接)

随着微软最新正式发布的Windows 11 24H2&#xff0c;同时也带来了大家翘首以盼的Windows 11企业版 LTSC 2024&#xff0c;我们看到了Windows操作系统在企业级稳定性和个人用户体验上的又一次飞跃。虽然LTSC&#xff08;长期服务通道&#xff09;版本主要面向企业用户&#xff0…

RabbitMQ安装(Ubuntu环境)

安装Erlang RabbitMq需要Erlang语⾔的⽀持&#xff0c;在安装rabbitMq之前需要安装erlang # 更新软件包 sudo apt-get update # 安装 erlang sudo apt-get install erlang 查看erlang版本 erl 退出命令 halt( ). 安装RabbitMQ # 更新软件包 sudo apt-get update # 安装 rabbi…

python迭代器和生成器区别是什么

python中迭代器和生成器的区别 1、共同点 生成器是一种特殊的迭代器。 2、不同点 a、语法上&#xff1a; 生成器是通过函数的形式中调用 yield 或&#xff08;&#xff09;的形式创建的。 迭代器可以通过 iter&#xff08;&#xff09; 内置函数创建。 b、用法上&#x…

面试题:Redis(一)

1. redis是单线程还是多线程&#xff1f; 2. IO多路复用听说过么&#xff1f; 3. Redis为什么快&#xff1f; 1. Redis是单线程还是多线程&#xff1f; 版本不同&#xff0c;Redis基于的架构也不同&#xff0c;所以单单问是单还是多线程并不严谨 3.x 之前 redis都是单线程 4.x …

Tianrui Green Shield

Tianrui Green Shield&#xff0c;即天锐绿盾&#xff0c;是一款专注于企业数据防泄密的软件系统。以下是对天锐绿盾的详细介绍&#xff1a; 一、基本信息 产品名称&#xff1a;天锐绿盾&#xff08;又名绿盾信息安全管理软件&#xff09;公司官网&#xff1a;www.drhchina.co…

VM虚拟机安装 CentOS 7.6 部署宝塔面板实操

一、centos下载 进入centos官网下载页面&#xff0c;选择7.6版本&#xff0c;依次点击 tree-》isos-》x86_64/-》CentOS-7-x86_64-DVD-1810.iso 进行下载。 centos官网下载页面&#xff1a; https://wiki.centos.org/Download.html1、打开下载页面 二、配置CentOS 7的网络 1、…

【Java 并发编程】多线程安全问题(上)

前言 虽然并发编程让我们的 CPU 核心能够得到充分的使用&#xff0c;程序运行效率更高效。但是也会引发一些问题。比如当进程中有多个并发线程进入一个重要数据的代码块时&#xff0c;在修改数据的过程中&#xff0c;很有可能引发线程安全问题&#xff0c;从而造成数据异常。 p…

可视化-最小二乘法拟合直线

目录 1、最小二乘法拟合直线 2、需要用到的公式 3、计算各个参数 &#xff0c;得到函数表达式 4、可视化-绘画图像 1、最小二乘法拟合直线 double x[15] {29,34,39,44,49,54,59,64,69,74,79,84,89,94,99}; double y[15] { 0.2989,0.3036,0.3084,0.3133,0.3182,0.3231,0.…

【HTML并不简单】笔记3-你不知道的列表元素和html、body

文章目录 无序列表menuol的其他属性typestart和valuereversed 定义列表dl、dt、ddhtml与body关联性overflow 桌面端和移动端的滚动条 《HTML并不简单&#xff1a;Web前端开发精进秘籍》张鑫旭 笔记 无序列表menu <menu>元素可以看成是<ul>元素的平行替代&#xff…

生成正激波表的代码

k1.4 import math import numpy as np import pandas as pd #Ma1到p之比 def Ma2p(Ma1,k):return 2*k*Ma1**2/(k1)-(k-1)/(k1) def Ma2rho(Ma1,k):return (k1)*Ma1**2/(2(k-1)*Ma1**2) def Ma2T(Ma1,k):return 1/Ma1**2*(2/(k1))**2*(k*Ma1**2-(k-1)/2)*(1(k-1)/2*Ma1**2) def…

【陪诊系统】打包问题

使用vite打包后&#xff0c;点击打开index.html是空白的&#xff0c;然后查阅了一些资料&#xff0c;原来是路径问题 【解决办法】&#xff1a;在vite.config.js中去添加base:‘./’ ok,完美解决&#xff0c;再打开打包好后的index.html可以看到界面了

CoppeliaSim和Matlab建立远程连接教程

CoppeliaSim和Matlab建立远程连接教程 Matlab通过调用CoppeliaSim的远程API和库函数实现远程连接,为实现Matlab和CoppeliaSim的联合仿真做准备。 一、获取并查看版本信息 点击 Help 查看版本信息 使用的CoppeliaSim Edu版本为:4.4.0 位数:64bit 二、拷贝API函数和库文件…

Ngx+Lua+Redis 实时IP黑名单系统

实时黑名单系统&#xff0c;如果用php脚本实现很容易&#xff0c;但是效率惨不忍睹呀。 要想速度快还的在nginx层实现阻塞。如果iptables 层阻塞速度更快&#xff0c;但是黑名单列表如果有更新就必须要重载配置&#xff0c;实现还是有难度的。php管理后台把黑名单ip写入到redis…

【数据分享】全国地级市2000-2022年公路里程数据(Shp/Excel格式)

公路里程是表征城市建设的重要指标&#xff01;我们发现在各省市统计年鉴、经济社会发展统计中有公路里程数据&#xff0c;例如下图为2022年南京统计年鉴中统计的2021年和2020年的南京市公路里程数据&#xff1a; 我们特地从2001-2023年各省级/市级年鉴中汇总整理了全国地级市的…

PCL 将点云的曲率数据保存至txt

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算点云曲率 2.1.2 将曲率保存到txt文件 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新…

【论文速看】DL最新进展20241008-多模态、医学图像分割、扩散模型

目录 【多模态】【医学图像分割】【扩散模型】 【多模态】 PaliGemma: A versatile 3B VLM for transfer 研究机构&#xff1a;google 论文链接&#xff1a;https://arxiv.org/pdf/2407.07726 模型及其说明链接&#xff1a;https://huggingface.co/google/paligemma-3b-pt-22…

leetcode68:文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c;尽可能多地往每行中放置单词。必要时可…

RWKV-7 预览版、大量新论文...RWKV 社区 9 月动态速览

欢迎大家收看《RWKV 社区最新动态》第五期&#xff0c;本期内容收录了 RWKV 社区 2024 年 9 月的最新动态。 9 月动态省流版&#xff08;TL;DR&#xff09; RWKV 官方新闻动态 RWKV-7 发布预览版RWKV-7 论文撰写已面向社区开放RWKV 官网上线 Bad Case 收集页面RWKV 中文文档已…