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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 `0 K1 S5 ^: z9 ^5 b& [
! o- R6 d9 J3 O( ^) gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! U0 W' U6 |# j6 x/ B" L& K- ~( N
#include <unistd.h>
- _5 ]1 ^; c3 y8 v2 @" }#include <sys/mman.h>1 @8 ^: x5 }0 L& F/ g
#include <sys/types.h>
9 G. M" Y8 x7 Z6 i$ ?#include <fcntl.h>8 P3 e4 @) h, q+ @
' j' c, g; \3 Q) A) c
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 R  X% _5 P' [: s$ O" r1 g$ @3 \6 F9 C" [
typedef struct
+ z' s* \* f; h1 H" D{' `: W; r0 N" W' D. x
        unsigned int a;
+ i2 H, L; d# k2 a% ^8 X        unsigned int b;( c' d' U6 G$ s; F* o( A
        unsigned int packet_cout;) P+ R0 k7 h  V2 }& }- b2 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 C/ s1 D8 e7 @$ K( S
8 V3 P7 g4 q& [" N4 S6 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 q; s( N; P- C* `
unsigned int count_copy = 0;
2 ?! ?" q8 e' `, B, h/ ]+ D' ^& H' G4 a& l8 z

- X2 J8 a: Y, @( iint main()" y3 D& d/ E8 Y) z# Q/ m. P! f
{2 E1 F) G9 }# y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. y0 Y/ y1 g1 c6 Z5 A7 l7 B' w) D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 Q: {+ F' y" m/ ?1 {' |
- [- r- U( g4 \* s4 s# y
        while(1)* s$ s  v0 H/ T( x9 r. o8 ~
        {
% K. k. @$ d- k! E0 _) n- c" c                read_MSG_buffer(pshreRAM);& m2 J, C0 N2 ^7 G* _
        }               
; _& x$ z7 h: Q! ^" X1 D( Y}
) U  Y1 m8 K# X3 Z0 ]! |: u
1 d$ \2 N5 |. I! W3 ^1 _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  ~$ Z" x* v% H% |; S+ V; H
{
4 v8 W, v. {0 [, v- m: X# O        RX_MSG_PROTOCOL buf;
- M  F9 _) |8 u  Q4 P        ! r# [3 B: g) c8 D5 |7 f
        buf.a = pshreRAM->a;
* I4 G! T% O3 p        buf.b = pshreRAM->b;2 d6 u) x/ c5 W; a+ r# ^1 Z" e
        buf.packet_cout = pshreRAM->packet_cout;
4 L+ H& D$ J$ T0 Y        ; v: ^& l; J) `# w
        if(buf.packet_cout != count_copy)( H4 D! M! g; G, j7 M. _4 @2 _- {
        {
. q: C% D& b, G                printf("a is %d\n", buf.a);
* ~  ]) f/ Q6 q# |                printf("b is %d\n", buf.b);
) B1 u! M7 Q8 o2 ]! p% p8 O5 f7 B                printf("count is %d\n", buf.packet_cout);% p6 o  a! s4 I1 F. N+ s
                count_copy = buf.packet_cout;0 j# Q7 S* D. A7 T
        }
( S0 h1 {/ h: C* X3 }) U4 n" ?        else; y; ]4 H/ ]! O" M
        {
# ]) n& j& e" L9 D; N8 I                printf("No effective message!");' S6 ?2 K- f. b' Q( h
        }  t) x* p: E7 E& ^
}
, S9 H2 U" N9 l; }: a( A( n. B- P
2 N- \4 w* S( G3 K+ q% R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ [& i8 }  }8 d4 I使用下面代码,对内存使用了mmap函数后:! T3 M" e4 e( e& S& t
#include <stdio.h>
* }# G7 P7 M) _3 r5 ]+ ]9 p#include <unistd.h>
) h! B/ t' s) N" Z6 t8 h#include <sys/mman.h>0 G+ T0 A* B; a3 h
#include <sys/types.h>
5 H2 C  ?- a4 g( V: J) T#include <fcntl.h>3 x% S& F- |$ U

3 W) z8 d( L) N# R3 M* b+ u2 |' L- [#define SHAER_RAM_BASE_ADDR    (0x80000000)( h) u/ ?6 z& u9 e# [) M
#define SHAER_RAM_SIZE         (0x20000)   6 G$ u& i. T" W0 F; G- q
8 _* X% X. t1 ~9 E
typedef struct
5 L0 \* U2 V) i$ |  h( t2 w{
' b% _5 E9 s+ l        unsigned int a;
) v  B6 f% Z3 b        unsigned int b;7 F9 i  R& O8 \# n
        unsigned int packet_cout;
  m8 }$ J' Q( h  c9 j. T4 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 `( J7 P# H1 h' x9 u, \" G# ]* U% m# h# ^2 j6 V2 I
void read_MSG_buffer(int *baseaddr);, g* a4 Z7 o9 w3 e* w( ?# _
unsigned int count_copy = 0;5 Y2 x( ~( v% L2 h
! p% s; r; P- L! N: m$ i
int main()
8 e% u7 ^& r6 ^. P! H7 q+ V$ t{* a% |% H& ^8 }! x
        int fd;
3 n/ _) t; z7 d2 @* ~7 n0 ~: I        int *mem = NULL;
' {; E! U7 O* g1 f# C' u3 _8 Y+ X. x4 B( b! e
        if((fd = open("/dev/mem", O_RDWR)) <0)( A2 H! v( ?5 m" U" ~" W, m( n
        {7 ?7 s% l8 y/ S9 D( E+ T, P+ s
                perror("open error");
) L, W  _$ K& W, f                return -1;+ T9 {/ Q# `# s" |. D( t% H/ Z
        }# q8 p' L+ y; ]# S  X( T
        + a# e. ^7 `, ?4 N
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ D4 t9 A& T: V% T1 x- I; w7 n) \; l6 E2 v4 }4 I; I
        while(1)
* R# @, `6 E5 k0 i( j$ Q        {2 |" n7 Y8 Y% X. A3 D3 e
                read_MSG_buffer(mem);. [1 f4 m, d9 p4 M& ]
        }                7 c" R/ g, ?: @4 U
}
4 ]9 M/ K+ K$ s" y" m2 v! x, X& W6 V. u6 X7 |
void read_MSG_buffer(int *baseaddr)
- m8 L3 D7 S$ \2 @) d( S' K{
% l' ]/ O" W- M& b% ~        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 o$ X) r7 H( L( {2 T  [+ s" e" B9 L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 G/ @% t7 _  b$ Q8 S; e' I
  T7 u3 t+ w$ }* K        if(pshreRAM->packet_cout != count_copy)
4 w: a7 L) J  @; F8 u; G        {, w  [/ O* O! D% @$ ]. z4 ^. k
                printf("a is %d\n", pshreRAM->a);
: k$ l: ?( d+ W" l                printf("b is %d\n", pshreRAM->b);* n: ^/ o) [' Z; A
                printf("count is %d\n", pshreRAM->packet_cout);
6 k! v0 q8 D; H+ w9 ~, K( W                count_copy = pshreRAM->packet_cout;0 S6 \  R) T- D. V
        }# W1 z7 m& p8 ^- y" w+ f1 v
        else- S: E1 ]* F7 d
        {, {- ~  T% f/ s( `/ V
                printf("No effective message!\n");0 e% j8 V2 \; l3 Y% e1 E, D. j8 L$ f
        }
; O- k. J9 Y+ y) L1 L}
; F1 V$ d! u  p
3 y/ C1 B: B4 f没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% O/ T2 q3 o. J8 T6 t1 h! s3 m4 `7 F

3 v3 k! J. ?6 h7 X; E5 x! I9 p& R' Y1 N

: t' K5 x. L! L: D* e+ m: u; o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 15:41 , Processed in 0.039974 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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