嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
X4 q+ a) D: Q: f$ }/ k+ b
6 D+ u- S7 R& j; @- w/ C3 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: n0 r% Q* D- H! r" n# `3 d; `$ B5 G
#include <unistd.h>
) h6 C( D, O8 R9 e
#include <sys/mman.h>
7 o$ r& p; H3 q
#include <sys/types.h>
; z5 ^7 w6 O! ~7 ^" J% R7 N: ?
#include <fcntl.h>
3 V7 I- @) S9 s6 v- c, h
8 `1 [" l5 ~' P) g, |) o( U
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ I/ D6 [% k& b
: ~# Y: {. T m- R. F
typedef struct
7 m- B6 n" K, S
{
! T/ l8 i- h2 n& T
unsigned int a;
! `* z1 i* W0 `9 H# b: U
unsigned int b;
. ], j1 q, l2 S% n
unsigned int packet_cout;
1 P9 {, [, `7 y0 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 c# j8 K. R* q( \0 w4 I
. @/ a" }+ i o" {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 [' f v7 ?/ N0 K4 P3 c4 t% T
unsigned int count_copy = 0;
/ @2 E* x* `( T5 `
1 N1 v; A8 i# E- E& Z2 b" I
1 G( B4 q' O7 @3 V
int main()
! U, H+ I% n; }( |, j" I$ G+ @- f% b
{
* }1 {' a3 p5 m: P: Y$ x- J: F
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 H$ [" z8 x* O/ N
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! `; X1 Q! |" U0 D/ \" U
l. {, l y( H: F/ Q
while(1)
/ S/ M0 p0 p" i: p/ [
{
% N/ X0 n% T4 W: K2 c5 u9 G
read_MSG_buffer(pshreRAM);
" t; O, d6 [7 a
}
: I# [8 \( s% e2 E8 O6 l( _
}
' r6 I d5 K8 _% r
! R, b1 e6 `& N7 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 P, I: Z( V+ B" R. P) V+ z
{
& A/ `& N. n& y4 p+ b/ e7 _
RX_MSG_PROTOCOL buf;
( O+ H: M+ i3 d0 ~
1 t( j L& ]% B
buf.a = pshreRAM->a;
! j1 Z- Y; ?1 r, s ]
buf.b = pshreRAM->b;
, T6 Q# h' o- V/ d2 l4 T: i; E3 \) z' \
buf.packet_cout = pshreRAM->packet_cout;
* O1 \) p# V1 V3 Q. b
1 T. a$ Z, m* X8 v4 Y
if(buf.packet_cout != count_copy)
0 g# U8 I4 c. ]6 u* e
{
# k2 X$ D4 Y9 X
printf("a is %d\n", buf.a);
4 i: ? u* @! p3 U. `
printf("b is %d\n", buf.b);
! X$ C" C9 L* b8 G( I
printf("count is %d\n", buf.packet_cout);
9 r3 `: [6 H- p) D0 z( g
count_copy = buf.packet_cout;
& k8 D8 F) v, w# j9 q) G; p; v. }+ e2 t
}
+ \2 z6 t) i$ k: F
else
2 \" S; c" @9 x' H
{
, i+ A0 N. l1 p" A0 [
printf("No effective message!");
( K# @ M( V$ ?$ G
}
' ?/ [0 g- A! V" T
}
: A3 y% Z; ~& }$ ^4 D* C# p
K5 k4 B+ E5 }" U/ p2 U$ q* u
! O1 N3 ^3 D3 E( F+ K6 d1 ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' Q4 b5 }/ L( P, b" R% l0 J
使用下面代码,对内存使用了mmap函数后:
7 E" ?5 d1 ^7 K7 [3 W8 y" i
#include <stdio.h>
& \% w. X* z, d: X
#include <unistd.h>
- ~; e3 U2 X! g0 [2 n* ^
#include <sys/mman.h>
) f3 B% L! W. r& M
#include <sys/types.h>
! T. }7 ^) B% j* X: u+ o
#include <fcntl.h>
3 f0 Q" B3 D% p
" G u' v0 ~. t: F
#define SHAER_RAM_BASE_ADDR (0x80000000)
, P" i, e$ ]2 h" S' }7 q
#define SHAER_RAM_SIZE (0x20000)
# w) o4 N+ r! ~7 }2 U8 K1 _
# W0 A$ o. k! U0 {+ k+ Y
typedef struct
" f: S9 r1 i' V
{
1 O! @7 r; H9 P: A
unsigned int a;
; h3 T+ A: X) @ ~
unsigned int b;
1 K7 o* a' I' V% s9 N8 K `. d
unsigned int packet_cout;
" O6 s# v$ [5 {& C c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
E, k& x1 H4 o+ U3 U6 L8 e
4 {4 t9 T! N; [8 ?& ]4 W
void read_MSG_buffer(int *baseaddr);
0 l6 W" C: ^0 @
unsigned int count_copy = 0;
+ C! d5 q2 F; P. A. X: A
6 m3 |0 j" N2 X
int main()
) d: ^; G; s( o3 W* \6 m) c: w
{
# e* }5 |% o/ ]4 o' ^& O
int fd;
* r; W& }) n* o2 d# H* z0 v& J7 p) Z1 o; S
int *mem = NULL;
3 j9 `6 u. E3 L/ \8 }% v. Y
% i+ j% f/ {8 i6 x% e; |
if((fd = open("/dev/mem", O_RDWR)) <0)
& O, I$ ^( G6 }4 J8 T
{
3 a" _* {& e. ^6 g. F& d
perror("open error");
0 f1 q* K8 Z7 V8 S9 c" G! B3 E {
return -1;
3 {6 t0 \% K4 x# @( I4 X
}
3 x1 q! q2 B9 v5 ]/ P* p
" N% G$ Z) X& k; h+ Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
{! [8 ]% T; w9 `" Y' K
4 q/ P2 `9 W5 Z1 ^% X# H
while(1)
/ f( l6 Y4 _) `9 k
{
+ Q' P+ m1 A0 a, o8 R
read_MSG_buffer(mem);
' K _7 x8 e! `) H
}
/ K- X; }% t* L) @# C( V) e
}
! a2 L p; U9 ?) F' f9 b; _
?) V4 O% ~' T+ y9 z# m, g
void read_MSG_buffer(int *baseaddr)
' R' L) @" H, `" S4 l
{
! O y: K; Y+ H5 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 I! t) I! x( u# ~) d
4 l& L- M" j/ W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
r5 E1 D3 H* \# G2 \0 \
7 r( p% A8 Y p1 G* r" g
if(pshreRAM->packet_cout != count_copy)
9 {2 j8 \! {% q; f6 M% X+ ^$ _
{
- T, O$ H' h5 k+ T8 m
printf("a is %d\n", pshreRAM->a);
) a5 L& X9 F' ]2 w- l& }8 v5 T
printf("b is %d\n", pshreRAM->b);
; \3 j+ l3 }# k" e4 K6 _ \4 b
printf("count is %d\n", pshreRAM->packet_cout);
$ T* G, `3 E, l5 e7 ^& P. S: H
count_copy = pshreRAM->packet_cout;
, X: g$ d* m) Y
}
1 j) o: ^5 X% s- ?2 i
else
9 `+ r( E, p6 c6 s
{
7 a6 }: n7 W5 I; a4 J
printf("No effective message!\n");
6 o& j4 \, A1 K: k. m. m
}
& W6 V c8 t& ^1 T( @- E
}
7 p/ |+ J0 G9 N; q- z9 ~
7 }& v& s* J+ @. c7 Y) Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ ]/ X1 E2 ^/ Y6 v
: y$ F! C9 W9 B. A5 ]* m* n
( b" ?8 ?* F" o
' q& C5 j; w( x! m* g
C" g) N# w0 s# H( }* E/ Z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4