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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 [7 i) l2 l- p5 A8 c. o
# ]& \8 y# A- T+ a: MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 f' v$ ^3 X0 x6 X1 k
#include <unistd.h>2 h# Z4 X" d( r
#include <sys/mman.h>
  e1 H0 s9 h( |! s  b8 b#include <sys/types.h>
& L- K+ o8 l3 v# \#include <fcntl.h>5 r1 C* V+ o3 [+ r/ D, c
4 T* [3 Y9 ?, W9 e% e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 C& v& k7 N2 c
2 t7 |, b1 d# h( z! e2 O1 U" P
typedef struct8 b5 s, y6 Q5 }  ^$ y8 {
{
9 z* B) f5 r* o3 K        unsigned int a;6 R0 C4 _* T/ X0 I
        unsigned int b;& v9 S0 E& C) k+ b4 @* u
        unsigned int packet_cout;8 x' R  t0 |# Q5 [7 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! y/ A0 a: j( `6 B/ p: m- L& \8 |
' Y- N. Z; m2 [8 m4 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ t: x& J$ s# ^+ r! yunsigned int count_copy = 0;
) ?* y. G: l% s9 r' [  G. v; b
$ w  Z- W! }. w
' y, v$ G- H. n; M  Eint main()0 R* K+ ?6 u: `" W% u1 W9 o
{% H4 E$ i$ B: x
        pRX_MSG_PROTOCOL pshreRAM = NULL;" w. z+ Z, L" G
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 o# j- E! p+ |1 C" F0 I1 p  E% R# I  E( d; }
        while(1)- i3 a5 L; F, J8 i# F* H; @' f
        {
: ?) g0 s* G9 S- g                read_MSG_buffer(pshreRAM);
! g  o% {, V! M# M1 S& f        }               
0 I3 D( U% z- ]  ^1 U}3 h( [* h9 B! n
: V' T( R8 S0 I* P! q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  q" W# U9 \7 W2 n+ Y' j3 }
{
) z7 J& G( a( n0 ?: ^2 ?; H/ O        RX_MSG_PROTOCOL buf;
" x8 b5 q% H9 B        / U0 F8 V# e) R. P4 e  n
        buf.a = pshreRAM->a;9 s; A4 B# z2 P* j
        buf.b = pshreRAM->b;
2 ^% G" |  v* T3 h$ _) U5 r5 A        buf.packet_cout = pshreRAM->packet_cout;5 ]- T) X9 A8 T  S- G' v  r4 `: f
        0 x/ w: W6 r3 r% L, W6 B; S
        if(buf.packet_cout != count_copy)* N; Y$ H" j1 W3 O9 S: v+ i
        {/ U+ C6 G$ U0 f5 }. Q/ r: [
                printf("a is %d\n", buf.a);
. ~- y! J; U  g6 q* _: h- Z: c                printf("b is %d\n", buf.b);
8 P- B9 z( X) n. B& P: r) s' b% J                printf("count is %d\n", buf.packet_cout);
3 F9 B) S9 S4 J7 i) S/ [6 f                count_copy = buf.packet_cout;
! B2 I) M' c) m$ [1 }        }
2 R2 V0 S3 Y" {* ^        else
8 m0 o* K0 G$ y        {
. q1 N  z7 K; i4 ~& w5 k0 R' o                printf("No effective message!");% g8 X( P# I$ w% w6 {
        }
/ ?% o) J  l1 P- j- O% r3 E' Q}5 {# V$ z0 t8 I

2 }2 v, u6 k$ |" q. ]& ]  ]8 g6 r. W7 C7 P. b0 J4 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; k% }, H4 p, c3 z9 l3 }使用下面代码,对内存使用了mmap函数后:
5 |5 \3 y& O" {! h  k% w8 K( S#include <stdio.h>+ ^. ~7 ?  a7 i: a6 l
#include <unistd.h>) V* r3 y  ?  F8 k: ^2 r" c
#include <sys/mman.h>( I5 |5 F8 y; _1 s$ k- a
#include <sys/types.h>
/ F# t. O/ J; c. }2 F. s#include <fcntl.h>
9 t$ K% t) q1 z: h/ z6 H
9 p& W6 @9 ]' Z, q/ b+ ]  N. G#define SHAER_RAM_BASE_ADDR    (0x80000000)2 l; V/ I+ n8 Y( E
#define SHAER_RAM_SIZE         (0x20000)     P( ]$ g/ X/ E% k3 M* O0 w

# ?! E9 Y9 }, D- G' e( Itypedef struct% G7 N6 U, u* w8 W1 ]! P) ?: a
{; S1 H/ }" B% p! w" G' K
        unsigned int a;& c6 u. C+ |& j; f( h
        unsigned int b;
! \- i% l, G' S/ W  Y; T$ Z        unsigned int packet_cout;9 p) D) q) V& j+ r! K1 g, U* |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" D; z# X8 \% t  h) I  u
; T$ f8 i& f# [  u5 u
void read_MSG_buffer(int *baseaddr);' X, r: f9 ]! ]3 n- d" r9 l
unsigned int count_copy = 0;; P& N+ ^* r! s
& d! z5 V& W9 m2 J2 ^
int main()% D$ _0 M& R# S
{
# j- U0 M& M  M, M        int fd;5 o& Y, p- Z5 I' ]5 }
        int *mem = NULL;
- N" e9 o7 g* P. ?$ b/ D
- U2 b: X( f. ~# p) `        if((fd = open("/dev/mem", O_RDWR)) <0)
. C% e" Z# M! {! [) V        {
+ J1 ?9 y. I8 n( n) S                perror("open error");
$ _9 @/ I; v& S                return -1;
( N( d) F! G+ F        }9 {- u5 k7 H/ a1 @! w$ w3 ?
        
' d( B7 l1 O& g0 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. t$ S* f% f' n7 d  o/ V0 H/ p; M! K# Y. ~, a2 {: ]% Q
        while(1)
# C$ b1 K& ], l! s1 e- e4 A& ~        {
' u; i+ u7 p9 W8 X9 h                read_MSG_buffer(mem);/ v  x- I0 s# w& M
        }               
- Q% a) o6 a5 h5 [  R}; w7 b/ x; a* I$ }$ p

% v2 t) r$ e( `5 c# j; Tvoid read_MSG_buffer(int *baseaddr)
. x4 z. u; {4 r! d6 `{' Q9 e' }6 G9 ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% q1 \. [6 |* M" M6 M6 O, c( x: Z: e) M# S1 k2 l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& F: o. \% U* I& Q  i/ t' B
7 c: P0 c" o, f$ G4 e1 ?
        if(pshreRAM->packet_cout != count_copy)
% |7 L9 e" x( b2 F5 g# v$ q        {
% Z- r7 h& _5 n) U                printf("a is %d\n", pshreRAM->a);
, J" H( B, A& ^+ J) j7 N. g                printf("b is %d\n", pshreRAM->b);
0 L1 F, L' \! {' o+ _& ]1 i                printf("count is %d\n", pshreRAM->packet_cout);
2 ?. |# h9 i3 ?% I0 L                count_copy = pshreRAM->packet_cout;
  |& M, U3 u/ u- C8 X: |/ D        }% d, r# r0 P& e" t- Z
        else
1 d6 f* Q; V! T; B0 S) E        {  `' w" U9 r5 x* C
                printf("No effective message!\n");
3 W+ S+ e  {# M2 s  S% V: _6 P: q        }
8 ^6 s' {! {4 F# e2 d) b}
+ H% k2 x: Y/ b2 D& v1 Q% V0 o: F# I2 W- O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) D, `) m  f; S; Z4 t6 T3 I/ @5 a4 [2 K& ~) [
6 f' k# K$ Q  ]- V- U
  ?( a0 J5 t% w. I' J1 }- E4 M5 r

" [; r# g( q) ~2 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 22:32 , Processed in 0.037621 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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