OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6054|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& s* U3 {7 q- N/ w3 Q! Q' L% d5 r1 N5 K7 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 x8 k$ g% x, A
#include <unistd.h>
2 F& B. i& W* q1 W2 h" {#include <sys/mman.h>
0 H/ I+ p, H2 G, r#include <sys/types.h>$ {. O4 b, o' s# ~( _
#include <fcntl.h>
& _" k0 @  o# |$ Z7 U/ ^$ q  O  }/ }  y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   . u9 _& x- S: u. T2 s" n$ v( D
2 H4 i/ k( [  G* n/ v) C# i
typedef struct/ z( Z+ O5 q5 Y5 u, A
{- D, l6 l9 w: e' a, L
        unsigned int a;$ O; `( Q/ j  `4 J+ a: H8 P
        unsigned int b;
5 q0 O' W7 P6 p5 [9 W: m. o' V        unsigned int packet_cout;# J+ i4 H7 x( w- ~/ E" M: s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 E! ^$ s3 j# t. {# C
1 Y& J* V3 K/ [( W9 e+ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 `, f: \! t+ W- Q, iunsigned int count_copy = 0;
3 P3 B2 A( o% e; V
& T% C" A2 R# y1 P0 o* c: M
$ s$ ]& E3 v0 U* Uint main()
# l2 n* @1 Y0 u8 Q! v, B, e& x{
$ P8 c* l3 L% [+ D# d" M# B1 ]9 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;
, W4 u* [. W8 I        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! [! i3 `  H. L- P) N( t* L8 a: m. n# u4 ~; S8 Y
        while(1)
; ]0 H* t8 Z" H3 H) }        {
1 Y6 f* R3 u+ r4 y. T. i7 D- g* H                read_MSG_buffer(pshreRAM);- I3 \0 B! I% c
        }               
. p( }* ]5 c8 C: {, Z5 z$ P4 k0 J}- g$ g! t; H( Z# _; @
/ c& z0 @1 Q" s* s& Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 L5 T* W: H- V8 r8 ]2 @% d{
" D; l3 E) c' f! a1 Q  u! o        RX_MSG_PROTOCOL buf;4 o0 _/ G8 ?4 v/ y) @2 i) Z: V
        
2 r- f6 T. R" D1 A        buf.a = pshreRAM->a;
: y* V% t' k  Y4 [- Y" M        buf.b = pshreRAM->b;
5 Y2 z/ i, I! a' p        buf.packet_cout = pshreRAM->packet_cout;
# n' Y7 q2 |% S- l/ y9 Y        0 v9 N$ a2 Z/ X' H+ f8 C5 z
        if(buf.packet_cout != count_copy)
9 g+ H, r8 B8 @( T5 m7 H* g9 k; K        {7 H; a3 M  B* [& K
                printf("a is %d\n", buf.a);
, G' U$ V6 |8 h& q                printf("b is %d\n", buf.b);; d7 X! ], r( b$ E7 b9 ]
                printf("count is %d\n", buf.packet_cout);
0 l0 Z/ O& l/ I+ d                count_copy = buf.packet_cout;
2 ]& @* B4 O/ O. w        }
  ~1 L& C/ a" ^4 x        else
/ b, G2 Z0 [# {        {
; P# [- k' z( X9 b, ^                printf("No effective message!");
$ k- x" q( B- F8 ^" ?% H5 t4 ?* ~        }1 c, U# `5 _: A1 C1 x
}
: b4 K! `/ J6 }! F2 L* E3 p5 C9 k% _8 M1 b; o

' H7 o$ q) c1 j$ ?, R# U  {但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 H: k; ~$ ]- x0 P$ u使用下面代码,对内存使用了mmap函数后:
- O% G0 o6 h" N& V( r#include <stdio.h>
7 F- K  j! Q4 n* Y3 N( W#include <unistd.h>
0 v1 \# Z* ^! \, p; F. ?#include <sys/mman.h>
- @5 F; H, `1 {# P& V# v, q0 P#include <sys/types.h>
5 r6 ~1 s$ K' f1 F# f. a#include <fcntl.h>4 A% t) E8 J8 r1 a, l7 ^. ^
0 r& _8 w0 J% _& T( Q' e, m
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 e: \* _1 l9 G5 h2 v3 t#define SHAER_RAM_SIZE         (0x20000)   ! X3 r0 C+ U: I$ k' f

# }% F. t& o. O. b8 F- otypedef struct
* A- k6 Z" ]) w8 v2 ~7 w0 x. S2 r{
( G" }" Z- Y. f6 K' ~0 x        unsigned int a;
, F$ q  ~0 w; r        unsigned int b;
2 U% ^' p. W+ @; z        unsigned int packet_cout;" }& m# S4 v3 e& y4 x7 O+ s/ m! M: Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* p: W4 Q$ I" ^) M' d7 s2 [

3 ?/ p! r& v) pvoid read_MSG_buffer(int *baseaddr);. n6 S* W( g4 p0 @# K0 M7 h% D
unsigned int count_copy = 0;
) |/ ?, q0 y+ C5 E( j  B1 u
" q1 O5 B+ h2 e* v8 S. x, Dint main()
) s& N) `4 C: d2 b- h! Y, @, _{
' R6 K0 @! G/ I+ B# `        int fd;0 x" k# l) J; g
        int *mem = NULL;0 x) q! \& w- D- G
6 _. {+ c4 X- f9 X
        if((fd = open("/dev/mem", O_RDWR)) <0)
) ]* v, f0 v: Q$ B3 P# V" \        {
3 T8 y" r& f6 m$ Y" G: Z' h- p                perror("open error");$ T" k% g& h0 o6 g; i
                return -1;
) K4 J* a! |" f+ ^        }% K' z) D; t) i; U3 w
        
+ f/ N, I, a/ m1 w1 S/ [& e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 Z+ r4 W6 }% X( s- q+ o( Y/ k0 c# D$ l0 O8 z8 u  Z/ N) z1 X
        while(1)
7 ?( R* q7 w6 h        {' Q  x% `( t2 o6 {
                read_MSG_buffer(mem);0 K* q. c, G8 x. R5 E
        }               
' r7 e* J, [' a6 ^; k}0 Q# r' B( U; }- r5 L

* h  |+ x: ^/ c( [6 L; ]( q  ^void read_MSG_buffer(int *baseaddr)
; }, b8 W$ @$ l  N! b+ i; Y" }{8 m0 t- d" T$ A! T7 K& q5 Q! g* J+ S
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 K0 N5 `* }4 v# l2 p

9 w( u5 x8 ~& k# ~' N" w0 H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! B0 Z6 r3 x9 v8 E- g

5 }/ w; M5 k+ n; B4 w5 |* t! A3 j        if(pshreRAM->packet_cout != count_copy)
( ?0 P. ~. Q9 L4 a) L' X  y        {
+ [/ l1 n; ~/ P" \6 ?' X                printf("a is %d\n", pshreRAM->a);3 B5 b; d: }7 g+ k, `3 y
                printf("b is %d\n", pshreRAM->b);
: X: y, ^; ?2 B$ l                printf("count is %d\n", pshreRAM->packet_cout);
8 R- [2 V2 J3 Z3 i# r; d7 z" p                count_copy = pshreRAM->packet_cout;
6 I* g' M0 A; X& e        }
# z' j, U$ Z+ W$ [        else
7 V5 O1 q) E: ]( G* w: J        {
- p- {3 H* w4 `) H$ x                printf("No effective message!\n");
7 x1 u9 M9 A' d- z        }
1 \1 L3 c2 ]- B' \}& |8 E) W- g! l) _) ]2 c2 F

3 Z8 e8 f: A; u, B没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" r( O9 `" w2 ]* f
9 S' }8 [3 k  s9 F) i

3 a% P* h: V. X3 a; x9 }" k6 M" r0 w) J" Y$ B+ r) T* ]+ c
/ M5 x  C! o2 t0 m# e1 \% [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-4-7 20:35 , Processed in 0.040753 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表