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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 j# m* Y3 \" l) T3 m
" t. H2 W* S# ?; d, I/ w' `OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># k3 A4 V! J. J: f9 k3 f5 C2 x
#include <unistd.h>( A) d1 Q$ w  u6 I7 \1 `
#include <sys/mman.h>
9 G: v; ~, m& }) P#include <sys/types.h>
) k/ @0 B. N' r, w  \#include <fcntl.h>
% n. \( o, J) w, d7 _5 U. `
1 u: ~: C8 q' n5 C#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 c7 H9 i0 ?4 e$ S9 L# V3 x2 m0 T0 M; m$ t$ q( ]1 c4 Y* N( C* B
typedef struct
4 T- ^7 t: f( s+ B2 c{
5 G8 f  U$ ?( _        unsigned int a;# T0 ?) k* {; a
        unsigned int b;
1 u+ O/ j* Y( W: m3 j4 M        unsigned int packet_cout;2 g4 j& l! f2 q* e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ W2 C, l9 Q" I2 ?) x
# V% d- K- d/ D/ Y7 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( n# _( L2 }) @( e; v% x
unsigned int count_copy = 0;
5 \9 x# A) m/ M" {9 o; B$ [0 i; {0 e
9 G* x! e7 i5 ^7 ?! M9 u$ B4 C, Z) D
int main()
( P" ^& u' p! o3 D% R{
4 W2 A1 s, z( V* K+ ~) m- z        pRX_MSG_PROTOCOL pshreRAM = NULL;- G! x5 z# [& v7 j. _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 P/ T" X* \; M# [$ `2 Q+ m" N
) Z! ~. D; r6 L$ U
        while(1)6 h7 z; X, K( R, @
        {0 H" \! q# i# b% a
                read_MSG_buffer(pshreRAM);
% ]+ O, V# s4 \" S# ^# I        }               
+ x* u  r$ H1 Q# e}
6 V/ ^0 ~% G: J) f! T$ G9 z; D0 j& X( K/ p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ ?( ~1 @) _) A" o; A8 v* x+ [- B{
4 F0 W/ Z3 ^6 ]& k# ]6 o0 f        RX_MSG_PROTOCOL buf;
  W% l& D4 P0 F2 Y; s  z; B4 Y        & j2 z+ m2 |/ k, N
        buf.a = pshreRAM->a;, T# D& x$ ~% t( F6 ^
        buf.b = pshreRAM->b;
' @( k* @# E) B) d6 T7 g5 }+ A( |! ~        buf.packet_cout = pshreRAM->packet_cout;8 G& K& d8 B5 ?
        ( h2 M/ e9 @+ p4 [; D# N
        if(buf.packet_cout != count_copy)
& l4 H7 a8 M  j& c- f$ Z% Z        {% l9 r+ f3 s2 n7 G
                printf("a is %d\n", buf.a);
0 a: q1 e* \# Z                printf("b is %d\n", buf.b);* }, h) |+ N" V/ @: x  I
                printf("count is %d\n", buf.packet_cout);/ B; M1 }: N+ c2 O( Y5 ^) O
                count_copy = buf.packet_cout;1 M. h4 |  L7 T
        }# k6 o+ ~; s& D$ v! F$ l8 s. N- X8 \
        else6 W: _, ^1 x$ m. `. K" e& K' h
        {' R( S- i4 }3 _# Q: {
                printf("No effective message!");
8 T. X4 R# |. T6 t        }
% Y& }! r1 \) h5 Q8 }}/ E- D3 r& R# k
: i" \2 r  L; C2 S

' ]4 ?6 l# F% ^  a# @1 n- U; e5 S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' S1 u9 f% q4 g- O" S使用下面代码,对内存使用了mmap函数后:
: V$ p9 t4 m0 n9 s5 t. N#include <stdio.h>
5 S4 s7 ~0 r9 s( ]#include <unistd.h>
! C  t$ {9 d. Y" f0 B6 I#include <sys/mman.h>
, D+ `/ V3 i" a/ F$ p#include <sys/types.h>
# C9 C' g- @. W: G: `3 a#include <fcntl.h>- U0 M! n8 z8 K0 S% ]

( z7 F/ c2 H: `1 d/ A+ ^#define SHAER_RAM_BASE_ADDR    (0x80000000)
& i: V! ]( h1 ~#define SHAER_RAM_SIZE         (0x20000)   6 A. N: F+ d% X" b* n

1 T2 |; J! T3 k2 i! I' Itypedef struct' F+ E+ V  J' Z, y5 I6 U- w
{
2 R9 Y7 E! B% c& h& V( @  u        unsigned int a;
) j# F- t: k" D- K, v8 s        unsigned int b;
7 V0 M( N8 a) z6 X2 s" \/ A        unsigned int packet_cout;! H; A- |0 p0 X; }2 I2 K1 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 z  V5 i% Q5 y, k, I* P+ R
$ f7 c8 U" V4 @) y8 a. y/ X1 Kvoid read_MSG_buffer(int *baseaddr);
$ q& c/ M- e, X  i$ j# i: L4 }2 P( |unsigned int count_copy = 0;& F" @" h- A* J, m, P; W- X

( }, K8 t2 y. o& l1 I& W# D. ~int main()
' m6 q, W2 `$ m$ q{
6 g$ i6 Z/ T( Q2 x        int fd;
* ]) j  S! V1 ~2 |  C. ?5 e7 {        int *mem = NULL;7 u/ R6 |2 c: o% J3 E

, e8 f' Z# m3 p/ H        if((fd = open("/dev/mem", O_RDWR)) <0)
3 _* n  B% G0 ?! G0 A7 e        {
5 `/ f* s4 d$ a; o( J+ ~( g* U8 R( {                perror("open error");$ w- m+ R. j9 h# ?' N; i9 x0 f
                return -1;
  N0 G4 m6 f' x1 a        }
% c# d+ w* r; H2 i$ b1 D0 Z) }        
; B5 W$ }$ K' s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 l% e: C3 c( r4 l) L3 ?  }2 v4 y& T4 A
        while(1)
+ S& B5 |$ N- j& Y" w# ?9 O        {  j7 q) C; n) }$ X( e" F
                read_MSG_buffer(mem);/ A1 R$ o/ j4 x
        }                & y* x# B% z4 }3 ]9 F. I6 S) q
}3 K% {- U6 U! C" N! O
7 j; T1 d0 @$ I9 ^8 G( b( O
void read_MSG_buffer(int *baseaddr)" I) M8 z# }7 W1 {4 B
{
0 a( C/ \5 ]) o9 R' j3 j& I        pRX_MSG_PROTOCOL pshreRAM = NULL;& J) H) Q  @% F$ M" E/ |
0 w; B9 W' Z% E4 A3 U5 g% f! b
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ U* }+ x! A8 ~: @8 r

! P2 u2 u6 W4 }  t        if(pshreRAM->packet_cout != count_copy)
, x* S/ F, Q! T3 A9 }6 t        {
6 x2 w0 P1 q7 V4 K( Q/ ?, a                printf("a is %d\n", pshreRAM->a);, s$ a" U2 E8 e& e  P- [  k
                printf("b is %d\n", pshreRAM->b);
6 \3 W4 O2 H2 L0 |+ U                printf("count is %d\n", pshreRAM->packet_cout);
0 `1 d3 V% V6 H8 G                count_copy = pshreRAM->packet_cout;
* w* z- k4 D: v        }
6 c3 E/ N6 z! g1 w1 u        else
, s& \: }0 ^0 U% h9 Q$ b5 A        {
# f/ [; k9 Y- ~4 R                printf("No effective message!\n");3 N7 Z% H6 X0 y
        }2 [7 M9 A/ V. |1 m- s# R
}& k/ |. o) ]5 l% Z# A( {( E8 A
5 T( l2 D& M& d. l$ f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( J: _* J% q$ ]" @6 l. P- v# D3 u' S: c2 r' n- M6 d
! ?7 f: c6 @# n* ~% a
. K2 }& t) S3 H9 c4 i

) Z! i) W& n: r9 O# w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-30 11:24 , Processed in 0.037756 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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