OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 I/ W  E# R/ d; w9 B
' S) ?# A; C  y7 K# z2 v7 m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, I5 D/ S) }# U* Q  m
#include <unistd.h>
6 T+ i0 p: a  x3 d1 m( n#include <sys/mman.h>
' B& s7 {) r  e, s#include <sys/types.h>" S/ V0 g  E  A+ A  p
#include <fcntl.h>
9 c* j. A1 ?0 s" T) n9 S5 K' V) b5 t0 m: y! p! ]# @
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* U& Y) r- F0 Y5 Z& n& l3 `* j# M# @( A- q$ D9 J8 c# i5 {7 K
typedef struct
$ [0 x0 ]. C& `8 m{% Q8 l% u/ B5 [2 }+ L8 h0 J
        unsigned int a;3 }4 R4 \7 W0 X. b
        unsigned int b;2 k$ z" Y7 T- a' @2 V1 E
        unsigned int packet_cout;
6 W: u  d8 x1 S4 c) T$ F3 |5 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( X) r- l; W, t; @) g2 N; Z' H' y7 {, j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& U# H( ]5 q3 S9 q: C
unsigned int count_copy = 0;9 K. J8 o; h9 B5 R

1 j: Z; E. B8 n& _  X+ W0 t: Q$ T9 p) N2 g! i( ?
int main()% `! n* h4 r* R- s
{, q+ l1 X0 n0 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 W' ^& K+ U+ |1 i  z6 K6 x
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 {  l4 ?" b3 c/ n% ?

6 v4 C; H. W9 e# ]        while(1)
; S: _' g. w0 P4 p7 o- G        {
  S7 Q( s: i4 D3 `3 O- ^. T: G                read_MSG_buffer(pshreRAM);3 f: m2 ?- q, D7 \
        }                8 {6 r/ |6 c  S& e
}" A; _' l8 R" _( T
) @# s: [" k% D: p9 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 y- x: U, @# Z
{* n7 `* v) k9 J* R. j
        RX_MSG_PROTOCOL buf;: _8 H% B  V2 f0 Z" f  F
        ! I. W- ?6 a1 t2 j, x6 p) \
        buf.a = pshreRAM->a;
5 s, g0 Q5 l! ^4 \        buf.b = pshreRAM->b;
, J) P+ s  F3 ~. D2 L        buf.packet_cout = pshreRAM->packet_cout;
8 |& L0 l: S- ^0 r# Z, A        & W) z" u) T2 B" s2 s+ R
        if(buf.packet_cout != count_copy)% k" |# C/ p6 c7 o! ]
        {3 R' A# N% F- K8 x1 J5 J+ T" q
                printf("a is %d\n", buf.a);5 F* b3 a$ J0 ~( J9 O
                printf("b is %d\n", buf.b);' f  c) P4 u" }
                printf("count is %d\n", buf.packet_cout);
: D8 ^  v! {* G0 a6 ~7 v                count_copy = buf.packet_cout;4 r/ q. P/ }2 u
        }
: A0 i8 y& _0 B        else
( I$ p0 @# k, m! P% Z; k+ p        {
, d$ p- x) A1 P- K( i, j' ~                printf("No effective message!");
/ g9 B+ T# F$ Z' i! F        }
( v$ y/ A# y! _2 D' v3 i0 R% ~) D: Y}$ o+ y  B7 A/ O( P. Z! d

+ V1 s1 a8 ]) \$ f/ z2 Y1 d5 |& P
7 m7 O( e1 A; s$ E1 p6 j8 s9 z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ ^. n& s' z% O4 s/ i' X6 W
使用下面代码,对内存使用了mmap函数后:
! L7 X4 Q  {& k* n2 L0 T#include <stdio.h># }- Q: [1 B* ~. J
#include <unistd.h>- B2 v: L/ f; d( F/ ?
#include <sys/mman.h>
. ^* J/ c9 Y3 J6 ~) {. G) D#include <sys/types.h>
# E3 Q( A  q) i#include <fcntl.h>. ?9 o- z$ p; |- }: ~' w

2 [: @9 ^6 j5 H$ B( w#define SHAER_RAM_BASE_ADDR    (0x80000000)
. V; A3 c0 k# ]/ P! A#define SHAER_RAM_SIZE         (0x20000)   
5 [/ x) t0 u/ B
' O6 B" W4 X/ w* }% V: stypedef struct
' T; ~5 T7 e7 S9 }{
- q4 m! J: A8 ^  A1 f, s        unsigned int a;
# ?" o7 ^8 z) L9 \8 a        unsigned int b;$ a9 ]1 z. Q* I7 x, W( o
        unsigned int packet_cout;9 a; t' ?3 [1 l; h2 y8 N; B2 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- w& s/ Y% j: }5 c0 S% l' N  Y- e4 ^* }7 _  h! p, z
void read_MSG_buffer(int *baseaddr);
: I" W: X3 \0 W& ^unsigned int count_copy = 0;+ T/ |7 |0 R; h7 T/ `' o; U

- }/ t& [# _9 E' u* C, iint main()
9 r  E2 m0 w# q" }, f0 c6 W6 x: I{5 i$ o2 H! y4 a+ @
        int fd;7 Q; o( r* S6 h
        int *mem = NULL;
- J* z: Y2 K* Y  P2 g: C
5 q- n2 f7 z8 _0 U  \" f; r( c; f. Y        if((fd = open("/dev/mem", O_RDWR)) <0)1 F# D! H" w$ J+ W* e" {
        {
" ~  _$ B) D9 s( T) Z% M: |! C+ R                perror("open error");
" e, P$ `. c1 H* u2 a                return -1;
+ ]- z( ?3 m, d- X% Q( K" `# Q        }
, Q$ n4 }1 ~" r        : ^, E, p- ]6 J- Q6 ]. M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 _0 p+ h" N- i8 q

- z4 e# O0 t  f4 p( p5 q) H+ t        while(1)& q7 J0 a# r4 U7 W$ L
        {
9 `' a8 d5 r( E$ P8 I; y; y! u8 ~                read_MSG_buffer(mem);
/ q& c/ Z3 H! a7 P% p        }                ; I3 y, b0 L6 B4 z+ Y* H0 L
}7 v2 |6 r% x. O
& u! A7 |% c8 I+ W+ Q
void read_MSG_buffer(int *baseaddr)
7 ~0 I& @( E6 W: \7 [9 H{
) t, x8 a. B4 W( w' Q/ Y        pRX_MSG_PROTOCOL pshreRAM = NULL;/ E8 Z+ S5 h5 l+ o
, s6 e# Y- v$ B) A. f; B4 x
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' ?2 P  X, O) P2 _% {2 h5 ~9 Y/ a% d' A
        if(pshreRAM->packet_cout != count_copy)
2 r$ Z: `1 ^, H- k# ]+ i        {' B8 c; O7 |. z4 @+ \  ~; j
                printf("a is %d\n", pshreRAM->a);
; q% L. O5 w6 l, X! [                printf("b is %d\n", pshreRAM->b);
$ Z3 w/ U% L, ~: E1 p! _                printf("count is %d\n", pshreRAM->packet_cout);
- p1 A: Q) s: R5 P, E/ O                count_copy = pshreRAM->packet_cout;
/ {4 R3 p; s# X0 O' k        }
# X4 A$ U/ f. }        else& f9 A9 L+ _% M4 Z
        {% m9 h6 j; N: L, H( N/ _+ i' K7 r
                printf("No effective message!\n");
- ^& [0 I2 s5 h; T- `4 z5 i        }
- V2 N8 f, c3 t7 ~}
4 L) o) m. s( b9 D$ Z& w) c) v; h/ k& f6 U. I- z9 |/ e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. h( f9 @2 z4 f) ^- f5 `: _7 f9 B! ^& k
2 ?. [7 w. @5 J7 J- f3 x3 ?# x5 b0 X

1 X- O) A" h) h; s' B
9 n& d3 T5 j) r% d" T2 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-23 02:37 , Processed in 0.047655 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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