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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- ]' a: O; R9 o# w& U
6 q" F6 t0 t9 F! OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 r7 _/ }, G; d, k* V
#include <unistd.h>0 B2 X. F$ d+ e, v6 h( Y& O7 _
#include <sys/mman.h>$ Q: x% `% `9 b5 R) F
#include <sys/types.h>% D3 L% D) c, x- ^" C. X
#include <fcntl.h>
* D5 p$ R5 [6 Y/ f( r7 |  Q
! U* s% ^/ |, f) `#define SHAER_RAM_BASE_ADDR    (0x80000000)   * I0 s  Q& T( k( n; A
1 w" ~7 a  P4 ?1 F+ q
typedef struct+ g. m# J- a1 L6 @& o
{
' i+ K6 |% J2 x( H        unsigned int a;: S' g5 S1 A8 Q5 q7 e& T# G
        unsigned int b;1 a/ g+ {6 M6 F, [% C# I/ ~
        unsigned int packet_cout;- }7 I4 n& A1 \. h9 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ?9 {8 |$ \8 y- }% j5 h2 L# X% f) T1 h% F7 C+ E, {( A( f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) D) ^- V, i* Ounsigned int count_copy = 0;
) V7 u: q7 t! H2 d4 E& s
/ G9 h; b/ @* d; D+ h! v
  @+ m8 G  C! H* @9 eint main()1 v& ?7 Z+ |- [
{  G  R$ ?$ g3 T3 T
        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 R* ?3 t0 E) X# C! _        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) V9 Z) P& w% u8 J; e% D2 ]
$ `/ Q, M% I" d' B8 }" ?        while(1)% F, d& S7 ]& L) k
        {
" |# t$ [, U3 ]; @2 a                read_MSG_buffer(pshreRAM);) n( d; ~( [* r; V" H
        }               
+ b6 T5 O# n2 d+ u1 a8 U- k* @5 l}
2 I7 @8 d; c& Z' ^: |
: l# |  J5 ]7 L; C1 fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- B& {4 ?+ P9 F7 y+ L3 r  o2 a8 z& q{
/ _8 a0 m. g; T9 @        RX_MSG_PROTOCOL buf;# R: E: L  w9 v
        
1 n. c- D) f( V( X# g4 y4 o" S        buf.a = pshreRAM->a;
  N( K5 Q3 C: `: `        buf.b = pshreRAM->b;
3 r6 e4 \3 T$ B* g' U# n$ L. z        buf.packet_cout = pshreRAM->packet_cout;2 @, y4 u. h4 O; f7 S  P
        
+ F! \3 a! s. o1 T; O9 w# p        if(buf.packet_cout != count_copy)
& i3 Q; m7 K. u4 {        {- z4 M: E: e- a: ~
                printf("a is %d\n", buf.a);
+ b4 ]- A+ s, J) P                printf("b is %d\n", buf.b);
* t1 w" E; ^' w& m0 e' X                printf("count is %d\n", buf.packet_cout);
: C( v; d' Q% J1 p* _3 g: e6 G                count_copy = buf.packet_cout;9 @% Q8 {' [6 q" p
        }
+ X' t; T# D6 I3 ^3 O' J        else6 S. ?7 a0 H* V+ S( _* a0 Z
        {# `7 }0 q; Z& h& W7 M
                printf("No effective message!");
7 }4 p5 t# V' e, q        }
0 ~. o+ S2 l4 |! n7 s0 Z}( Z8 _) _+ ^% a* a) M/ I

6 `1 ]) w- c" M4 N" Z, l* X, S9 ~- |- l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. Z/ P& _1 z9 m2 X7 o1 M, s' ~' c/ [. V使用下面代码,对内存使用了mmap函数后:
8 ~# O  f8 W; O1 ?6 X7 r#include <stdio.h>) J1 e" ?2 v* G4 v  X* B
#include <unistd.h>3 w* n0 |) @  I$ s6 D
#include <sys/mman.h>: I2 t: S: d" e6 `% b
#include <sys/types.h>
' Y" v' [) Q, n2 K5 f( j) M#include <fcntl.h>3 I/ Q2 t' E- h& C
; A! X- w4 s1 @! j; f) y# g. h
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 Y+ e% n7 x% _- R
#define SHAER_RAM_SIZE         (0x20000)   : `8 l0 [; ~5 a% I, U, O
. K7 _- p5 @- h) I8 [. O" e" B
typedef struct3 E0 H/ s5 `1 z. r3 b) O. T
{) N7 n  h# h' _$ ]
        unsigned int a;- A" y4 d5 x; g
        unsigned int b;" _4 K1 i1 u' h. T5 h
        unsigned int packet_cout;$ l9 ^' g* k$ G  y8 Q+ ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ p( k; a% C# z: i% C( O- B) O" {6 N" G$ @  \$ O+ P
void read_MSG_buffer(int *baseaddr);
( U# C7 d+ R3 v3 `; Bunsigned int count_copy = 0;( E* T0 S( }1 T1 l1 J9 A9 z) U" |
! c8 f7 a" ?* X+ w+ ~" K
int main()
% a" y# ?3 K2 p8 _* R& o" n$ h5 ?" Z{. v2 v: s' g9 X- O) W( g) S
        int fd;" q" X& d- N1 O' l& Z+ V2 m" u
        int *mem = NULL;
: K1 O" D1 x5 a3 e4 Y6 m6 O* f0 p  X$ o" [1 O$ F
        if((fd = open("/dev/mem", O_RDWR)) <0)1 l4 x0 `; f5 P6 Y/ b
        {$ Y1 r+ U% R( M: V
                perror("open error");
: ]) X. n& K, d: n- ^" i4 b                return -1;
: l" g& k3 J+ K3 V' W% ?% V        }% G6 p! X& r* Z2 n
        
, t! r) x: n3 M* |( {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* _/ r3 N# N- P1 }0 e
9 C8 f7 b6 [1 N' N% s/ w* ~6 e        while(1)
* [$ s" m) ^  M( w        {) u4 h- w+ p( X' {0 J0 N! l$ t
                read_MSG_buffer(mem);: U6 u7 S( H9 x" @5 ^$ f
        }                ' J' r  B4 I$ H  A/ `9 H9 g, L. g" D
}
2 p0 {1 x8 m6 a, X. {! A/ G% G: z% |! J6 J% L
void read_MSG_buffer(int *baseaddr)0 r& H3 T) [, H4 F
{9 z" ^$ o/ U) b( e$ v7 P+ X1 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 D$ _* K$ t5 u) |- Q
. \5 G# a- }) u
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  G' y9 u; \5 ]6 }; Y7 N
5 H, R8 s& f0 q5 p8 ?: F
        if(pshreRAM->packet_cout != count_copy), M9 p, x) F8 |' G
        {$ N6 P, h/ W! n
                printf("a is %d\n", pshreRAM->a);
9 n& t5 |* q3 r4 y                printf("b is %d\n", pshreRAM->b);& K2 u! u4 g- z& o) l! R- v3 S$ r% D
                printf("count is %d\n", pshreRAM->packet_cout);+ V8 u, ?( T9 ~' a- N  _8 @
                count_copy = pshreRAM->packet_cout;
% j: E9 L! v0 y. {6 [6 Z$ t8 ^        }
& l" Q& I* i6 i# k2 D: T! T        else( }9 `; d# _2 T
        {
, R! E" U1 J! X                printf("No effective message!\n");4 H  p$ x6 w" d, X+ S' W0 }
        }7 }2 p) u9 l3 q" K, X/ Z9 V3 U3 d
}9 y% V/ [: [5 [

/ z: ?1 E1 {* j9 v: ^9 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  i6 i9 G3 W! y
! J4 a0 \0 Q9 l" `

9 k1 c5 [8 R4 Z1 x
$ O% ]) q7 f0 M. O- d& S1 i  w: @1 P
1 t% k; H: Q+ i+ f% f" l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 18:22 , Processed in 0.039100 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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