嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 U( c. t; v2 J8 H
- Y! T) d; \. e" q# w4 T$ z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 H$ R9 u0 s( G: P) q
#include <unistd.h>
0 c7 n u# v' T/ \! I) u2 n
#include <sys/mman.h>
7 c8 Q$ H2 o! q7 q
#include <sys/types.h>
+ y& j- c$ z1 L! ]* f
#include <fcntl.h>
# k3 l+ A ]# s8 R
, k) R. U( J" ~: _& {9 i5 w; K
#define SHAER_RAM_BASE_ADDR (0x80000000)
: @, m4 t- ^1 k' U5 O* b7 G+ s- }
8 B; O$ @8 o T( ]: Q
typedef struct
( E5 G9 \3 w) A) }
{
1 |* `3 n7 l. c* Z; N3 |
unsigned int a;
1 q3 v6 z# O$ R2 t5 \5 Y1 D
unsigned int b;
- Y M- c" {% ]& l" h
unsigned int packet_cout;
% Q, y$ e. Q* H) {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ B0 ~# K u6 f4 x$ c. }8 m" i
0 p b2 W) G9 T" ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! X9 Q& A' Q4 P7 w
unsigned int count_copy = 0;
! Z: R0 O0 y3 D3 m: S
- h+ s3 k! R6 x! w0 L" A/ a6 ^' D
* s7 O" ~0 d# {/ C( s; t
int main()
`% [2 k0 `' e- V6 y0 D; C; t, N
{
; r7 A/ {) V( }! T, `- Z. a
pRX_MSG_PROTOCOL pshreRAM = NULL;
! [- N# L, [! ^# E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' _2 C* B0 n7 o D* y+ |* k
4 o% I3 _: j D% T3 O! X
while(1)
6 [% T- v/ k4 `( j) [
{
O% K! g1 D6 n/ d4 W
read_MSG_buffer(pshreRAM);
5 _% [ C( @( I% ?4 f# r* C
}
- j3 Q0 o- i& }8 I1 b2 b( c* P+ w
}
6 ~/ Z/ q8 z1 c# O
8 v6 ?3 B) Q/ o* W1 y0 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- }0 ^ U. u8 u, a9 J
{
- P& C' N( N7 d# {
RX_MSG_PROTOCOL buf;
0 I9 |9 A$ `( U$ Q3 i) a+ W/ B1 U
% Z/ e6 P& |8 @, Z
buf.a = pshreRAM->a;
& l3 w% r$ [ V, `! ^
buf.b = pshreRAM->b;
( e! U+ F ]! p! a$ v4 k E3 C
buf.packet_cout = pshreRAM->packet_cout;
8 O$ p0 `5 G3 D* x3 Q
" Q& L& e2 Q# g5 P6 B2 z! ?6 z
if(buf.packet_cout != count_copy)
$ \* C$ w" {: D7 s8 }
{
9 m! y4 p" l# b7 V: u/ |0 W+ `
printf("a is %d\n", buf.a);
& ?: Z) ?3 k, h, ~
printf("b is %d\n", buf.b);
5 g' ^& V* `; |3 A: Z' K+ l" a& O
printf("count is %d\n", buf.packet_cout);
3 B" D. V; J) F7 W7 Q% }+ [
count_copy = buf.packet_cout;
7 o6 H; ^6 i0 i8 U, x4 F
}
& l: F6 O' R" c1 E: l& P
else
) M: Z; ]: ~3 w+ w( j- B1 q% R( H) y
{
! [5 d" Q" P6 M. E1 Y
printf("No effective message!");
! O: _% a6 j5 J' ^% s
}
5 E+ i5 n0 y# M, l) ?0 K
}
6 ~! a. [3 k" m! Q- g) a
. j( C6 M+ G/ c _) v
! I6 N2 m Z# j9 Y+ L I* W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 i0 A' }3 G& a* t
使用下面代码,对内存使用了mmap函数后:
# i: W- y; ?; L* M7 K$ S& O
#include <stdio.h>
8 H8 q; Y3 E7 n( b* B+ n, n
#include <unistd.h>
, u% K2 T& {. n. O1 f+ d6 [6 p
#include <sys/mman.h>
2 u4 h6 v& g8 @* W% T# a1 c
#include <sys/types.h>
& A9 z1 @0 m/ n+ @% ?" `) J R
#include <fcntl.h>
) ?2 G: m( f' b: q3 f! k$ Z% S; \
$ w) U: W+ A% s2 v% }
#define SHAER_RAM_BASE_ADDR (0x80000000)
# R' G3 `$ q S8 @1 K u4 J: @
#define SHAER_RAM_SIZE (0x20000)
+ s7 n* p- X5 A4 F
( v L" v1 E- ~ v) Q# G: l
typedef struct
. A' p) A( ]8 a1 r9 \7 n" `( {
{
6 j* W- @( [1 C+ y- J# P4 Y& |
unsigned int a;
l7 W( ?4 x3 X3 [5 y
unsigned int b;
- ] l' l" C' t6 |# ?
unsigned int packet_cout;
8 P# E4 U7 A1 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 \. f: P% c$ ?# d6 Y+ ]$ {3 }
; E" E& x5 D0 B8 ~+ X
void read_MSG_buffer(int *baseaddr);
; ]5 ~6 H! M5 Q0 G
unsigned int count_copy = 0;
0 {1 X7 `2 }$ W% @
# L/ j4 Z$ ^4 E5 Q- {! K) O
int main()
! Y3 B( b+ U* Y4 D9 o8 f; U. m
{
' c0 A% w8 s* Z6 Y1 u H) U$ X
int fd;
# P* r5 R, `3 u6 i6 c: i/ y
int *mem = NULL;
m- x8 D% X1 x, b
& r% Y$ Z! ^, Y
if((fd = open("/dev/mem", O_RDWR)) <0)
& x h b" F A* T V' ]2 W
{
0 p* z* O. S) h: \7 D( e
perror("open error");
$ @5 _" J: a% T( C
return -1;
9 L5 I: V$ W5 Y/ S0 `
}
+ R9 o7 J* a$ M- v* D. n9 r5 N
. |" H6 u/ J3 W% q7 Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 q) T) z/ e5 a1 S9 |
6 a3 i ?5 j# Z2 p0 F
while(1)
. ~& f4 d, F6 q0 Q m
{
" C5 u0 Z) r, G9 _0 L# v ~
read_MSG_buffer(mem);
! o. P) Y( }+ |# G3 U8 g
}
( h2 ]3 |# k: G0 W$ O
}
# b2 a2 [: `* Y7 L& J: I
6 @) D) Q$ e7 z! u
void read_MSG_buffer(int *baseaddr)
, n# `' @6 [" t" v
{
! \# \7 h+ z" A& e: [4 k# e
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 g7 C2 C4 n1 G: M
5 T; j+ I* {) x5 F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' A! i+ |+ g3 O' ~# z$ b% S
6 c$ l3 I: {" Z- Y- x6 z
if(pshreRAM->packet_cout != count_copy)
/ o T# P6 q/ D) k
{
% }- F% @) b5 x5 b
printf("a is %d\n", pshreRAM->a);
8 C! J6 H& }0 h+ R
printf("b is %d\n", pshreRAM->b);
p% o L8 G* K8 d+ m
printf("count is %d\n", pshreRAM->packet_cout);
$ z6 O# Z/ k6 t, X, m9 M
count_copy = pshreRAM->packet_cout;
$ a7 @3 n/ @2 ~: {0 O/ y( ~
}
) X1 A# @3 L: m' g& v+ q
else
5 F1 N! k" G7 ]$ q- `1 l. w
{
/ r& T+ Q' e# I6 O
printf("No effective message!\n");
- E: ~' d& R5 d' o4 Y6 L$ Q
}
' B7 }1 f% v C2 m/ o/ P
}
/ g: s' |; W- y# c
2 I) ?, U6 x g' [: c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ k/ X% W {% b; j# c4 Z. i* d7 L
( A' S( s5 |' W1 c9 a8 m
: ^6 l; c/ N; K5 ?% x# N
# A" A2 B) X8 L0 H
6 b, V9 s5 J5 L$ E) Y: x# v; O
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4