OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! Y# I% R  x: v, i2 ~
  n0 m9 t4 p+ O) ]. s, LOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ i& N4 F6 E4 E4 A& l0 K& a#include <unistd.h>( }' E2 R% [+ ^
#include <sys/mman.h>$ V/ J- {' T1 K
#include <sys/types.h>
& `! y- B5 F" m1 N- V#include <fcntl.h>
7 v7 G. `0 r7 a. d  ^1 E/ e4 x
& ^2 y" k" T# F9 o5 V3 p! n2 s#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 z+ V8 H" i* b2 J: C7 f; y, h( e
+ {" c5 G# A; S+ B) c! T2 utypedef struct
/ S7 ^( p# H% E# g* c{
4 W8 O4 Q' t/ G! |+ M) @1 v, i        unsigned int a;2 [! `; n) P8 t# x  d( [" S
        unsigned int b;" U' v0 W' k* G- o
        unsigned int packet_cout;* s' Z, S0 A4 j+ w- F. G9 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  P! k- L" o6 G4 ?6 m" S5 d! ?

: C( A  I# u$ A0 Z! avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) i: F* d9 m4 W  ^+ D1 X* O5 }' g! cunsigned int count_copy = 0;
4 k" R2 @' }4 ~: ?" ?7 X4 a( P# ~' N$ v. |6 U

  b5 c) n* k8 R$ `# Aint main()  c# {* ]% }& w( _! g4 T
{
3 U3 F. p# c  \+ A        pRX_MSG_PROTOCOL pshreRAM = NULL;0 _( B, Z. o: r9 h% c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- V, W3 C" g3 J/ B+ T0 t( J. V6 R1 Y
) G" V% ]! K& x* P) h) B2 ^        while(1)
. \/ @- s( M# Z% S4 v+ u, o$ [( [        {) H( A3 o( B8 {7 u
                read_MSG_buffer(pshreRAM);, j" u& u8 i% N  @7 r( W& Z$ r
        }               
" Z/ M0 M6 \9 W( e0 i& {6 Y/ R0 E}
6 Y! z0 t8 V/ U0 ]: V! P% H5 ]
# H/ u! R- A5 D% s4 C0 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' m! H! m/ w  v{& O6 E9 ]; s, I9 ]+ J  }' N
        RX_MSG_PROTOCOL buf;* ^. p# w2 r9 z: I/ G: c
        
  @( z7 `/ J$ ]' I        buf.a = pshreRAM->a;9 A% V, |. {+ ?& F* C" y2 j
        buf.b = pshreRAM->b;
1 m% y" Y9 x# h2 K2 N; X        buf.packet_cout = pshreRAM->packet_cout;
6 j: T6 Q" I5 f4 }0 T        + W, P5 `$ V7 |! s% Y8 s
        if(buf.packet_cout != count_copy)/ g1 {, K+ x! z8 Y
        {
( c, [8 X- B  ?7 |/ ~" \( v2 f                printf("a is %d\n", buf.a);6 f  I' }- z/ y* Y! q
                printf("b is %d\n", buf.b);
8 h6 v& O5 w/ T& d$ W1 p                printf("count is %d\n", buf.packet_cout);
/ R, F; {" V2 [, z/ N8 @$ r                count_copy = buf.packet_cout;
! U8 _6 _& X  |        }' [% o9 Z1 Q2 a7 L. C, y
        else
) F3 |+ |1 R4 k* l6 n        {
, h, D0 t) e/ ^8 m' W# O! L                printf("No effective message!");
7 ?3 B! z7 P& l' N- z8 ?! K1 t6 Z        }, j8 }5 J2 V8 k7 x2 @1 j7 M2 e2 E
}
. [$ z5 _8 I8 X: J4 q- Y* v
( W- U; ~- r4 w" A/ E1 z2 \
% r$ a/ E( {) i, ], u% p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( @% r8 ]6 |" r" m
使用下面代码,对内存使用了mmap函数后:( ]% |3 _$ T' n' a. Y0 a
#include <stdio.h># T) _0 g" Q. b
#include <unistd.h>- ?* G- g+ ?1 E7 t6 b; y
#include <sys/mman.h>
; a2 B2 s0 X& u3 W# t* E6 W#include <sys/types.h>0 f6 e( ]/ [) @* H. l, l( B* @/ w
#include <fcntl.h>
( P8 M1 P8 q  ?5 F6 `9 \$ k
+ f  ^' Z9 ?. O! D/ X8 u#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 r7 {" S4 y) R0 x0 U5 E) H- u#define SHAER_RAM_SIZE         (0x20000)   # Q2 b& L3 I8 e( z( j: g  D

3 ^+ H+ w% r- g7 T  j% [* f. Ptypedef struct
7 q" b7 Y7 r/ G$ k, g{
5 t  \8 q2 R+ l0 A        unsigned int a;: k+ Z9 o: c9 Y* {: \! x$ ]- k9 K
        unsigned int b;
) O5 y2 e) j: v' S% \/ Z, m        unsigned int packet_cout;
& E1 j+ J3 C  J+ X" K! x: A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; Z& u5 r3 d% ^* d" J$ g; l
1 n1 ]' s8 I" G" \( o4 d1 R$ A
void read_MSG_buffer(int *baseaddr);5 t1 _4 h8 s! G, l; ~* ]
unsigned int count_copy = 0;) Y7 |6 P% t" U

, I9 E: E- f- iint main()
4 g* k/ _$ E- i) s+ f( X) N$ p{; \4 J* f7 l' [! R8 ^( e
        int fd;
" g' {  j: L7 N* o% _' T        int *mem = NULL;/ j) |1 N+ P3 {4 d# Z6 T. N. D( }) S

3 e  t( p7 s# c2 K, K! e9 U1 N        if((fd = open("/dev/mem", O_RDWR)) <0)  ]5 R& k; [" C$ B8 _
        {
7 Q: a) p" X0 v9 p                perror("open error");
) D+ n$ V! r4 J9 d- t  g" j                return -1;# B0 D  H. C' L/ F
        }7 g5 J  `7 q2 E  X; h) I
        5 y8 n: ^. [9 _+ }# L' I' P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 X8 s+ y# J: W9 a3 D# c3 n: J7 X& C' [  l# u2 b- ^
        while(1)& K: H& x  H& z8 O6 z, ~
        {
+ {* r* G8 L6 s' y                read_MSG_buffer(mem);( m' \8 s# k3 L" R
        }                2 o, ~$ h( h/ l' E9 o. F: I4 k
}
' G6 v, o7 |1 N- s7 |" u  ^' q1 z2 F) I; `5 R2 v4 L
void read_MSG_buffer(int *baseaddr)8 r4 h' f: M  r9 j! ?3 [% }
{
" {1 [# [# ~: P1 E) R        pRX_MSG_PROTOCOL pshreRAM = NULL;) X/ k  {5 P  i

, C& d; B/ k1 W4 _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! j( |6 N  k! m1 E9 x* q: u" V" P/ v+ ^* W. S; O
        if(pshreRAM->packet_cout != count_copy)( ?- s2 ^% T3 f/ m, O: |
        {
, X4 z9 L* J; G0 m  T# u4 I  v                printf("a is %d\n", pshreRAM->a);
  w( P) J8 X1 n+ ~2 o: t                printf("b is %d\n", pshreRAM->b);
) E1 S. i4 `1 \3 @& g2 c/ J                printf("count is %d\n", pshreRAM->packet_cout);
3 p  g6 P7 {; D( g2 K: [9 m% x1 m                count_copy = pshreRAM->packet_cout;6 G/ j* i4 r3 S1 ?( i, s
        }, C5 `, ^* d5 R3 s
        else
: Y0 J1 w! P, ^7 [0 c7 R        {
8 B; e& J4 x# C7 c                printf("No effective message!\n");) b8 \9 o: u$ m5 M) w
        }( S. H2 a/ V7 ~) l" _1 o- i
}2 p. w; {3 |1 ~6 J

& W7 {; W' g4 V2 Y# _( h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ M3 A- u- @# t  \1 J2 q+ A: N+ [: O: {0 J, _

8 o& `0 \( p! P$ M5 l, V& _- c3 F: }# H; e! n1 p( {

6 s7 t. y% I% v) [0 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-17 23:10 , Processed in 0.038481 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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