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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. O  A! S! n0 s5 {  W0 a- p+ C9 @% w5 e- X( `3 C# N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ B" G4 f/ B& n# M$ ?9 d1 y, p#include <unistd.h>
! w" O" w# X4 s$ F, x  A1 X  E) T+ Q#include <sys/mman.h>
' X: L, A5 \" y6 V" D" i+ H#include <sys/types.h>% W" J8 \: n# z5 g
#include <fcntl.h>
' p1 L/ ]. F4 H0 P6 b$ c$ ?) H: m7 f- K) `' M- S( W* f. W
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 d2 A$ F% P& r+ T6 h. a- j7 _6 Q- \  m! F$ s8 e
typedef struct5 h' Z$ A' Z. G0 e
{* V; ?* N9 m* L; E
        unsigned int a;
' }, d7 q. u& C7 m: d) g        unsigned int b;1 R" {0 \# E/ E
        unsigned int packet_cout;
% t# P# ~+ r7 y3 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, D8 @7 Y& S) z% o* T3 ]

  Z( u5 l9 r5 v1 v7 d4 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 J, _, m3 Z" F; X6 x/ Q6 _unsigned int count_copy = 0;2 j# N9 W2 v- `; m8 ^

- H# g3 G' J  ~) r4 o  ~7 Y
! V5 n1 c2 Q: ?- t3 fint main()
1 ~6 c0 B7 ?0 V$ r& V{
7 ]9 N' `/ e' D* [        pRX_MSG_PROTOCOL pshreRAM = NULL;( |9 o5 E" r; [. V% H- `. s
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  f" ?5 {# ^9 V+ e9 D. N
$ b/ |& k" O0 j+ T
        while(1)
0 H+ t, }; k! \7 z, b; O7 z; z- `        {
( L) W& ?% J. j  M' l7 ]. J                read_MSG_buffer(pshreRAM);
: Q! d) r. U) d) M; K1 ~0 r) B        }               
5 N5 y" j$ a' E* D; G9 l}+ p% A+ V6 Q% p( A; H
  c6 j) h% [+ ?6 J4 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# t. R5 S* a9 B/ W9 n( [0 A' t( V
{
4 g' `, e0 m7 \        RX_MSG_PROTOCOL buf;
! y# f6 X/ v9 h- g' P' ]        # K, c, r& |+ a+ f' X# N/ E8 K
        buf.a = pshreRAM->a;8 v4 S8 q/ [% d) A/ B; {! |
        buf.b = pshreRAM->b;; c0 Y5 o) r/ i/ G  v9 n
        buf.packet_cout = pshreRAM->packet_cout;1 l% b; @9 g3 U  V$ v$ i
        " t* l' |$ [, w1 \8 X  A8 h' N
        if(buf.packet_cout != count_copy)
$ f% i. m' Z" n% y: {        {  d" n0 y) }6 g& [& h
                printf("a is %d\n", buf.a);" O+ V% ?1 S7 r: n. {% M
                printf("b is %d\n", buf.b);
& ]* X! N% u2 W' B% O                printf("count is %d\n", buf.packet_cout);: W  B+ F6 Y# |
                count_copy = buf.packet_cout;. M# e5 Q, B2 Z
        }
$ k$ n  i7 F  V+ k; M5 S5 W        else- Z" ^7 c( R) c. D
        {
+ b5 Q: k% |/ f- J# D                printf("No effective message!");
3 V4 N7 D# K3 F  m' l9 h5 o9 i2 m        }
9 `# V$ |: q  x1 m9 R}
& x6 U; E* i/ a8 U  m; }) P: E
; f  N; o* }1 C$ n' d$ i3 a( {
5 B5 y, p! R3 n% e) [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- E0 t+ s' r$ N* A( U/ v" |使用下面代码,对内存使用了mmap函数后:% _; b+ n  w. c) g$ |! z
#include <stdio.h>
" x$ N9 p4 D. \- {- l) t4 W$ n#include <unistd.h>$ {: R8 ^$ t6 C+ t+ c7 x
#include <sys/mman.h>
4 b! x+ X7 e5 Z& E#include <sys/types.h>$ z$ g: j/ n6 L# P/ j
#include <fcntl.h>
+ o. @1 F* }4 c0 T7 }6 x0 G: f( G! B
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 i, w, \7 Z0 J0 T8 l) A$ J
#define SHAER_RAM_SIZE         (0x20000)   
3 _3 o: B1 P& s9 _8 P/ l& p, ?3 M& [
/ }  Y" W) C3 e% x% v$ U8 htypedef struct
; r+ \9 z8 V  E" d) ?. ]7 s{: y; S" {( Y* ~) l
        unsigned int a;
  z% {; M$ q' S9 D+ p) k$ }4 {0 r* C        unsigned int b;$ c+ V: K6 M( w# o  E$ f8 K
        unsigned int packet_cout;7 ?7 r8 g6 ?( I8 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  L0 A% X: N: _, b" a5 A% t. S- b

6 G9 u4 z% F" b- ^( }void read_MSG_buffer(int *baseaddr);* B6 W/ d9 F; D" {
unsigned int count_copy = 0;/ c# o7 i" }7 u, U: p
" |; G8 p2 Z: B& r
int main()
5 q7 Y; i2 C- k/ B9 z2 d( @7 W  R- |7 W{
+ |5 ?- _! J" x        int fd;
8 `0 Z! F' i' u" ?4 {. e        int *mem = NULL;3 Z  }: k. h! X' }+ [4 l
* x" g+ H" |3 ~" U8 x1 C- ?
        if((fd = open("/dev/mem", O_RDWR)) <0)
; |8 v- e+ }" w9 h. y" d" L        {2 X$ Q  v/ a8 s  G
                perror("open error");
+ D5 R* R0 E* e" Y& P) D: l% ~8 z                return -1;# F* M/ n1 w5 N7 F
        }9 C- C3 o$ U  F& m; Z3 P( `$ C8 x
        " U2 C7 ]5 c* i  X9 b
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. s/ `2 c6 K% Q+ M+ f5 j
. ~+ g; X; Q  E1 \, \        while(1)
! _! x% z/ R3 w9 b1 j1 F$ o% M        {
, I: |3 r/ v2 ^! G0 \                read_MSG_buffer(mem);
$ Z" g8 T6 H! G$ Z1 E- j& u. y2 @+ G        }                0 K1 q: r- X0 b) k. |/ q
}# g& d7 O, ?! D4 W9 k

4 v( m  w. X( F3 c; Z8 a6 Rvoid read_MSG_buffer(int *baseaddr): w# j# n8 R$ f, R: @$ I' j
{4 i9 b- x8 |- k
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 Z7 G  `: G# C4 z4 }" s! d: h6 {" Y, V- X$ x- H1 m- \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ P9 F$ P% w% r7 P7 ?' s( D3 y$ `' j5 i
        if(pshreRAM->packet_cout != count_copy)
: H3 W- z5 m/ Q6 ]* ]$ @! V        {8 R4 a. K, B1 ?$ B& Z$ ?
                printf("a is %d\n", pshreRAM->a);+ m' l7 Q9 Q! J# O5 ^
                printf("b is %d\n", pshreRAM->b);
0 y  U. G' Z& e: Q                printf("count is %d\n", pshreRAM->packet_cout);
* I9 V( o% x- h  t: k+ j+ f' ^                count_copy = pshreRAM->packet_cout;
! W: W2 Y, F5 f% o! u2 e" k, W+ e3 O" C        }& K9 e1 k( t. O) x( {/ d! V
        else8 r) K: B: o% A( m. r6 k
        {
* K* @% R/ n/ {. C                printf("No effective message!\n");: z/ c5 {6 p* }7 g
        }% {  U6 x. V3 h" w
}
6 Q/ ?& `1 B+ t' B4 b
8 c( i2 i1 n1 W2 s4 n9 U没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 m/ a$ a  j' ?. H1 u! O5 u5 Q9 ^9 f7 x- S0 a, ^1 ~. w) H- Y4 @

, C& A1 n- @" p- S: t- g- e4 _% l2 W6 p9 W. ?

4 c! s. {: G3 M" T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 04:04 , Processed in 0.040743 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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