代码编织梦想

使用普通的Timer中断方式时,Timer中断可以正常运行,但是UDP通信进程无法启动。其中TimerIntrHandler是中断服务程序,打印程序运行时间与从BRAM中读取的数据。

void SetupInterruptSystem(XScuGic *GicInstancePtr,XScuTimer *TimerInstancePtr, u16 TimerIntrId)
{
	XScuGic_Config *IntcConfig; //GIC config
	Xil_ExceptionInit();
	//initialise the GIC
	IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
	XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,
	IntcConfig->CpuBaseAddress);
	//connect to the hardware
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);
	//set up the timer interrupt
	XScuGic_Connect(GicInstancePtr, TimerIntrId,(Xil_ExceptionHandler)TimerIntrHandler,	(void *)TimerInstancePtr);
	//enable the interrupt for the Timer at GIC
	XScuGic_Enable(GicInstancePtr, TimerIntrId);
	//enable interrupt on the timer
	XScuTimer_EnableInterrupt(TimerInstancePtr);
	// Enable interrupts in the Processor.
	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
	}


static void TimerIntrHandler(void *CallBackRef)
{
	static int sec = 0; //计数
	XScuTimer *TimerInstancePtr = (XScuTimer *) CallBackRef;
	XScuTimer_ClearInterruptStatus(TimerInstancePtr);
	sec++;
	int rev = Xil_In32(XPAR_BRAM_1_BASEADDR);
	xil_printf( "The data at %x is %x \r",XPAR_BRAM_1_BASEADDR,rev);
	printf("Current program run for %d seconds\n\r",sec); //每秒打印输出一次
}


void timer_init()
{
    //Timer test
    printf("Timer test...\r\n");
    XScuTimer_Config *TMRConfigPtr; //timer config
    //printf("------------START-------------\n");
    //私有定时器初始化
    TMRConfigPtr = XScuTimer_LookupConfig(0);//TIMER_DEVICE_ID);
    XScuTimer_CfgInitialize(&Timer, TMRConfigPtr,TMRConfigPtr->BaseAddr);
    XScuTimer_SelfTest(&Timer);
    //加载计数周期, 私有定时器的时钟为 CPU 的一般, 为 333MHZ,如果计数 1S,加载值为1sx(333x1000x1000)(1/s)-1=0x13D92D3F
    XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VALUE);
    //自动装载
    XScuTimer_EnableAutoReload(&Timer);
    //启动定时器
    XScuTimer_Start(&Timer);
    //set up the interrupts
    SetupInterruptSystem(&Intc,&Timer,TIMER_IRPT_INTR);
}

改为进程定时器的方式后,UDP通信进程可以正常启动。DELAY_10_SECONDS与DELAY_1_SECOND是中断时间设置。

#define TIMER_ID	1
#define DELAY_10_SECONDS	10000UL
#define DELAY_1_SECOND		1000UL
#define TIMER_CHECK_THRESHOLD	9
static TimerHandle_t xTimer = NULL;

int main()
{
	sys_thread_new("main_thread", (void(*)(void*))main_thread, 0,
			THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);

	//sleep(10);
	const TickType_t x1second = pdMS_TO_TICKS( DELAY_1_SECOND );
	xTimer = xTimerCreate( (const char *) "Timer",x1second,pdTRUE,(void *) TIMER_ID,TimerIntrHandler);
	configASSERT( xTimer );
	xTimerStart( xTimer, 0 );

	vTaskStartScheduler();
	while(1);
	return 0;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiangla2577/article/details/89648118

【freertos】小白进阶之如何使用freertos软件定时器(一)_产品人卫朋的博客-爱代码爱编程

介绍软件定时器使用基础:单次触发和自动重载定时器。 1、头文件声明 #include "FreeRTOS.h" #include "task.h" #include "timers.h" #include "supporting_functions.h" // 定义定时器相关时间 #define mainONE_SHOT_TIMER_PERIOD

在zynq上使用freertos_tylerzy的博客-爱代码爱编程

在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。 FreeRTOS是一个

zynq7000 freertos 中断_gobeyondzk的博客-爱代码爱编程_zynq freertos 中断

问题描述: zynq7000 上 PS standalone裸跑,PS timer计时器中断,PL-->PS中断均工作正常,将代码移植到freertos工程时,中断不执行,task运行正常。 解决: Xilinx FreeRTOS (9.0.1) BSP, 中有一个文件: portZynq7000.c. 定义了一个全局的中断控制器 interrup

zynq 的64位全局定时器_tobeaiter的博客-爱代码爱编程

zynq 有一个64位全局定时器,我觉得有点实用价值,比如精确的实时计算,代码运行时间计算。怎么用呢?我就google 了一下,有篇文章推荐查看2个文件。这2个文件名分别是 sleep.c, xtime_l.c。这2个文件是Vivado 安装的时候就安装好了的样例程序,我的是在这个目录下:C:\Xilinx\SDK\2015.4\data\embedded

zynq freertos初始化中断_同年纪_的博客-爱代码爱编程

https://blog.csdn.net/GOBEYONDZK/article/details/86532440 问题描述: zynq7000 上 PS standalone裸跑,PS timer计时器中断,PL-->PS中断均工作正常,将代码移植到freertos工程时,中断不执行,task运行正常。 解决: Xilinx FreeRTOS

zynq使用freertos的cpu利用率统计-爱代码爱编程

硬件:ZYNQ-7000 开发环境:XILINX SDK CPU0:linux CPU1:freertos 以下是调试freertos时的调试笔记,20191031。 正常情况下,FREERTOS具有CPU利用率统计功能。

Zynq FreeRtos下开启其他中断(定时器Uart)系统崩掉的问题-爱代码爱编程

FreeRtos下开启其他中断(定时器Uart)系统崩掉的问题 问题来源 比如我开了freertos然后想用uart中断,然后就发现系统正常工作不了,多任务失效,只有一个任务在跑,调度器工作失败 问题原因 主要是全局中断实例只能同时存在一个,因为再初始化中断实例的时候会关闭其他中断,源码如下: s32 XScuGic_CfgInitialize

zedboard第二十三课(standalone, Event driven System , RTOS)-爱代码爱编程

在standaloneOS的应用中,只有一个主线程,就是main函数。 它是后台进程的入口函数。而各种中断服务函数ISR,就是前台进程的函数。 我们知道,Callback是运行在前台的,而main是云心在后台的。 这里,简单介绍前后台程序架构。 front and rear stage,即前后台结构。 front stage 负责的是event respo

FreeRTOS时间管理-爱代码爱编程

void vTaskDelay( const TickType_t xTicksToDelay )函数是FreeRTOS中非常重要的函数,用来延时xTicksToDelay个时钟节拍。vTaskDelay函数源码 #if ( INCLUDE_vTaskDelay == 1 ) void vTaskDelay( const TickType_t xTi

freertos zynq 移植_分享一下FreeRTOS移植STM32F302经验-爱代码爱编程

本帖最后由 八度空间 于 2017-3-12 11:32 编辑 移植硬件平台:项目板子 编译环境:IAR7.6 库版本:V1.2.2 FreeRTOS版本:V9.0.0 一、下载FreeRTOS源码 官网直接下载http://www.freertos.org/a00104.html或者原子哥光盘附带的,本贴也上传 1.jpg (44.

zynq+linux定时器,Zynq-7000 FreeRTOS(二)中断:Timer中断-爱代码爱编程

/** main.c * * Created on: 2016年6月26日 * Author: Administrator*/#include #include "xadcps.h"#include "xil_types.h"#include "Xscugic.h"#include "Xil_exception.h"#include "xscut

zynq linux 私有定时器,ZYNQ+Vivado2015.2系列(十三)私有定时器中断-爱代码爱编程

私有定时器属于PS部分,定时器可以帮我们计数、计时,有效的控制模块的时序。这一次实验我们认识定时器并使用定时器产生中断。 CPU的私有中断(PPI),5个:全局定时器, 私有看门狗定时器, 私有定时器以及来自 PL 的 FIQ/IRQ。 它们的触发类型都是固定不变的, 并且来自 PL 的快速中断信号 FIQ 和中断信号 IRQ 反向, 然后送到

FreeRTOS+Lwip+STM32 网卡驱动函数运行原理(网卡+wifi)-爱代码爱编程

塞2564196 项目背景 主板是野火的STM32H743,例程也是野火附带的例程,有需要的可以去野火大学堂下载。因为野火只是给出了以太网和wifi的单独例程,而项目需要两者结合在一个工程,所以需要弄清楚两者驱动函数都是如何编写的,方便合并。 Lwip网络接口函数 在Lwip当中,源码作者用netif结构体来表示一个网卡接口,内含网卡的IP地址、数

ZYNQ 移植使用freeRTOS系统运行程序-爱代码爱编程

ZYNQ可以移植多种操作系统,freeRTOS,RT-thread,wxworks,linux,UCOSII,这些操作系统可以单独运行,也可以使用openAMP双核模式两两组合运行,也可以和裸机SDK组合openAMP运行,具体看如何配置了;不太擅长使用 Linux操作系统的开发人员,建议大家还可以使用实时操作系统或者裸机运行,这样也有更大的灵活性。 一

freertos 任务、中断解读--zynq_sfloat的博客-爱代码爱编程

FreeRTOS 任务、中断解读–zynq 1. 中断中如何进行任务切换 FreeRTOS在中断返回时判断ulPortYieldRequired变量的值,如果该值为true则执行进程切换,否则不执行。所以在中断中只看到了