嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* B2 g/ W. y: X! P
7 _* \ `" _( e I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 Q. P* C9 ~' m
#include <unistd.h>
( W- m1 p- b4 ~- v
#include <sys/mman.h>
1 ^6 C Q R7 y# x( W6 J5 u
#include <sys/types.h>
, m# B6 q( U% j2 B: v
#include <fcntl.h>
( P( U; P* N8 g
4 V+ w) A9 E& r3 ~3 B
#define SHAER_RAM_BASE_ADDR (0x80000000)
* }. k O' N0 k( R E
, a3 y0 {2 G; W3 w! v6 _) v
typedef struct
& G: F* V# t7 Y6 Y
{
. V0 C2 F9 Y0 g6 e5 ~
unsigned int a;
: [4 J2 Z) R, P0 |0 d8 R
unsigned int b;
/ V( C7 t0 Z. r1 n [( c: C
unsigned int packet_cout;
$ h/ P" C( p: x9 R- W7 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! D0 u1 b+ k/ K$ I8 C) G# |" ^
3 C' A J, e. f- j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 X+ D: q% ?* d/ T- \8 _/ H7 g3 h
unsigned int count_copy = 0;
4 r( V4 \$ F2 g5 m( ]" B9 q
+ P) i8 D) d7 C% f+ b1 T
/ N% v( c$ b: ]" g8 Z. f
int main()
" m. J6 k2 W4 q. X4 l
{
! Z- q& i- m1 a7 O( I" r' y
pRX_MSG_PROTOCOL pshreRAM = NULL;
( s+ C& J! S( t$ }5 M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; a9 `5 c8 D% j: y( [1 ^0 H( N
! T; s1 z- i9 {5 K
while(1)
5 n* e& b. @* R! v3 O' R" A! }4 k* d
{
! x, S9 @$ G! E, n' e, J6 T" {
read_MSG_buffer(pshreRAM);
5 q6 X1 R( {7 t2 g# o1 a+ \% g
}
% `6 A; y9 c2 `
}
: w& O4 ^5 s' D- l* _! U
9 I$ F5 D* h! Y+ k" t* c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" u; E: s! o$ @
{
$ R7 X; }- C. R/ V% Y6 O0 ]9 `
RX_MSG_PROTOCOL buf;
5 X3 w" r8 F; O) f5 u9 ^
7 j1 i( l: W1 ]& t; _
buf.a = pshreRAM->a;
5 H2 X3 d6 F1 E. z( F
buf.b = pshreRAM->b;
. j0 [( m& s3 y8 i; p
buf.packet_cout = pshreRAM->packet_cout;
5 B# n8 q2 O) f! S
S0 _& s* E, P9 K' T
if(buf.packet_cout != count_copy)
: p3 W4 O. @# X& t w) W& y
{
5 `' x2 g5 K! N4 |7 ~1 q) s
printf("a is %d\n", buf.a);
' X! O% _& Q9 O3 B# r2 F
printf("b is %d\n", buf.b);
" q$ N5 K! v1 M0 p' m% J" z$ _
printf("count is %d\n", buf.packet_cout);
% O O% ?& ^) P; |" ^
count_copy = buf.packet_cout;
' U( e- W* B3 e9 Z# H2 U; l( m2 U* Z
}
+ s) S6 H' V0 Z# y( ~
else
& m* K% S" O, [
{
5 }% I9 ^( m/ t$ l& s
printf("No effective message!");
/ f; W9 [- [9 r! h9 Z: e. `$ W0 G
}
$ K4 z' A- {" @* w2 g
}
% g' \5 `8 o" I# u
. d" Z1 a5 B) S9 ~! T# u
) R+ ~% R0 e2 m( q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) Y2 t: |; ^/ |( p, o
使用下面代码,对内存使用了mmap函数后:
5 H9 p, R6 n0 O* x
#include <stdio.h>
+ p9 N/ ~( X! X1 R6 p5 G$ U# X6 @3 R
#include <unistd.h>
2 R" a* C1 L& f U3 S2 [( h
#include <sys/mman.h>
6 ~8 x8 \1 }- q9 X
#include <sys/types.h>
* s0 y7 o0 Y7 R9 L! m6 l! K* B* s2 N
#include <fcntl.h>
& Q" ]3 l- S- p3 e
- o% P; \1 z I" [# K5 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 M5 ~( M0 q, P" S+ U$ A4 |
#define SHAER_RAM_SIZE (0x20000)
. x% ^: u# r! t2 S: Y. Q
- u% Q1 D& N! d' O3 u7 f# I
typedef struct
' @* p* ~* l% f, n$ h
{
/ B# s$ }8 `/ Q0 G& S
unsigned int a;
* M- l& {5 E+ m8 s# l
unsigned int b;
! e. H/ }4 {4 G3 D, c. r! h1 e
unsigned int packet_cout;
9 K. x% Y! p G3 c# ~! m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* G! g) E! l8 m3 q* c
8 x; q. [4 F2 n& y- b7 _
void read_MSG_buffer(int *baseaddr);
6 y7 N. }, R8 t% }. z! F; {+ Y
unsigned int count_copy = 0;
, W6 k9 E' J/ j/ @/ T$ T
/ I$ c& t5 Y, p3 o8 G# A8 s
int main()
! c! y6 P2 i5 ]) i8 G( b; T. o
{
$ Q. u. M3 e( H8 @+ B( c: }+ x
int fd;
- m; k6 s0 [1 E' \- | d; O
int *mem = NULL;
+ B4 d. Y8 R: {) W- Z9 Q% A
5 S' U& M" d; o' d9 \) n1 @
if((fd = open("/dev/mem", O_RDWR)) <0)
& u- {' o, c5 t8 S+ x0 p
{
, K: j# c2 n8 l' X3 v
perror("open error");
! K/ O! `* R! Y p5 h; {/ O
return -1;
5 f5 W0 C/ M* Z2 @! O9 L! M) `
}
4 k/ Y0 A9 w7 {& f* y
f/ R4 q5 n. U& W1 H
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 H3 M6 ^$ Q# V% U5 }: l) `
" i j8 T9 A3 X X1 ]. z
while(1)
$ f0 s4 x# N1 C* o! V) D9 }3 ]
{
! i9 p# l+ A& ?9 V6 x7 b8 {( h
read_MSG_buffer(mem);
( b: R* C5 e# a8 S' z3 H7 ]
}
0 R* t. R6 N% X1 w1 P3 v
}
6 f: ^; {/ _* k# K! h7 x; G
/ _" o' q+ {; H" }) w
void read_MSG_buffer(int *baseaddr)
+ F, S* \/ \& E) M# H
{
* ?' [9 M# ?, _4 K( g$ b# a
pRX_MSG_PROTOCOL pshreRAM = NULL;
. E5 [5 E! e4 E5 [
9 S3 f5 v& W5 y( b1 I$ o: @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 X5 X# Q& x) |0 {: B. E
; R; v/ e% b8 K
if(pshreRAM->packet_cout != count_copy)
1 V+ k( Q3 D H4 y; ]
{
1 T) j! R/ R4 N q# [/ M
printf("a is %d\n", pshreRAM->a);
$ S2 O: F" Y$ N; U" W) w4 ]
printf("b is %d\n", pshreRAM->b);
3 q' I3 w1 q$ k
printf("count is %d\n", pshreRAM->packet_cout);
( {# W+ ?7 x4 B3 c
count_copy = pshreRAM->packet_cout;
# U5 p. i) F% Y, j- g# e
}
* p$ ~+ ^9 c8 h$ ^$ b$ y: B
else
% Q7 _2 v; O7 R; f9 r( ~' f4 b
{
0 N' [( F9 u/ z" e* [8 w
printf("No effective message!\n");
; \1 W/ z" Y0 i: r. U: C' u
}
0 T9 J8 l" H8 y2 g& D# k9 V* B) c
}
$ ~1 \9 Q% v, x: L
N! O5 `0 i0 s$ Y" D/ n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. K2 [8 T; ?; g/ l. i% J
9 o% ?2 X4 l4 _( n: y- |
& f! S/ q& n8 x; u' r
) h7 h! U6 e5 ?0 n5 {& E# [
; r& h" R w+ j- o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4