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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ p' S% [; f: f6 b4 _. p: p) H, t9 D. v8 S/ X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; _! n3 k* K( ~& {2 d( Q
#include <unistd.h>9 _. R6 q/ }4 ]# f4 h: Z8 E
#include <sys/mman.h>0 `7 R% o' P7 g6 c
#include <sys/types.h>
* i' e% U. ~$ t#include <fcntl.h>
: R' |# ^. _( L& B+ Q
8 g' y/ i9 P) N8 ~1 m5 y* G) i#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# k/ [- J& D4 F) l! H! y  @
0 {& |3 e0 I; {; Z. h! A# Q; Itypedef struct! s7 D: G0 r- Q: t
{
" E. Z: }. u$ `# }' Z6 N; k7 T8 |        unsigned int a;- r0 Y: k% J* {
        unsigned int b;" ]2 s- X- C% w7 x. q
        unsigned int packet_cout;) Y0 A7 _! a% v- j1 g) B4 Y6 e5 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 o: u! F* [' Z
$ h4 G* ^+ R6 S; j- v2 B- cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 d& ^. s2 \/ j5 @unsigned int count_copy = 0;
" g) x+ d3 E* n' V7 O( \5 T$ Y$ J# W# |$ U$ q
+ f1 Z5 j1 E0 _  ]) ^
int main()
' \! A1 z% {* L{: M1 s( G$ |3 ?$ s! c6 c6 T8 P2 W
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, i% h( ]+ n! J5 s; G3 c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. V3 D) w' h+ }% v* c/ W, `
" N& H9 |. ?* A        while(1)  Q% _$ d, l& O
        {
, o( h' q2 [3 k& J                read_MSG_buffer(pshreRAM);9 u4 W2 ~7 P6 b0 r+ t$ n7 h
        }               
- S# |  U% K3 A! l- {1 F, y}" w* l' @" i+ `) D: q6 U, ~

  E8 g' I, R  Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% J: O* `+ }  @* P. W1 T' p: q5 R
{  ~0 U6 x& p5 h; l  T7 f
        RX_MSG_PROTOCOL buf;
/ h& d: i  M* l& l: h        + |2 C5 V6 g( B5 a2 ?3 a
        buf.a = pshreRAM->a;
* L3 N0 j5 u- J- t" H7 f        buf.b = pshreRAM->b;
. s& E- n+ A& X! U        buf.packet_cout = pshreRAM->packet_cout;
/ Y/ `% P5 [% V( c        
/ j+ k- ^3 |$ S8 w        if(buf.packet_cout != count_copy), Z' K4 _& t. Y' [$ B5 A: T/ ^$ h  ?' x6 G
        {- o% E& U* H8 S, n/ g5 x* U
                printf("a is %d\n", buf.a);1 C) F' ?: z( B# q
                printf("b is %d\n", buf.b);
/ x' g/ ], p7 ~& Z% N; X# k8 Q                printf("count is %d\n", buf.packet_cout);
% P3 e% `9 }3 U9 {, d                count_copy = buf.packet_cout;+ r8 _& ?! _: \- k% D6 |8 |
        }
5 p# U$ @' T% v        else6 G) @+ d5 H$ r- u8 _: t
        {
9 K3 _5 }6 ]* s, O2 x, A                printf("No effective message!");
$ E, B+ M# {  c        }7 F5 S# ~; B# R
}2 w" _+ H) [* N$ u& @
6 a- b/ _1 }+ e+ R+ P8 y) C

/ c" X7 O* G1 D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 j1 H3 z1 r  r$ s. u' C使用下面代码,对内存使用了mmap函数后:1 e) ?) {0 U3 U' r8 B, `
#include <stdio.h>1 v: V/ K6 C# }" f0 m; m! H
#include <unistd.h>9 B" V- j* ^0 K1 M7 A% Z6 k4 B$ Z
#include <sys/mman.h>0 @' B0 `" R. o8 W7 `. v
#include <sys/types.h>4 Y- g8 T$ u4 [' u
#include <fcntl.h>
1 T, k+ d  s+ g6 q  t. K* x7 b( c$ D3 f& b" J7 A
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- z. `0 u0 P( T* G#define SHAER_RAM_SIZE         (0x20000)   7 d: c- B8 @) \
7 K8 Y9 k3 u) M5 A
typedef struct
6 b2 U- f6 b  y; D8 O0 G{* @' L. |- k. A8 n( \/ M3 b) p+ s
        unsigned int a;
( H. _" \9 ?2 j7 p( s0 O        unsigned int b;
+ L5 V! u# ?0 W$ l3 h        unsigned int packet_cout;
7 H" C* Q2 M8 t) U# W7 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 D7 V1 v' a8 B. W8 A
+ w7 M, G4 v4 C7 g& E0 X# c
void read_MSG_buffer(int *baseaddr);: D6 Q0 d) B0 Z$ j1 e2 S" C
unsigned int count_copy = 0;: B% d5 ~  c' v7 l- Z) Z+ h
" W9 }4 d* V1 j* E" T0 p
int main(). H8 B. M, V; `" T) F9 t: `3 g, B
{
* n& v1 ~' ^$ V1 I  C7 s% y& z' T1 B        int fd;
4 [1 m2 x: u2 ?3 U; f        int *mem = NULL;6 ?' i: c0 n2 q, W" i9 Y' N& f
1 ^% u; G) B  Z0 A2 ?
        if((fd = open("/dev/mem", O_RDWR)) <0)% `3 N1 ?" x' c8 @& S4 w4 g
        {; E1 D# r$ J3 O! V
                perror("open error");3 W) Z# X' b6 [
                return -1;/ L( H4 l: s8 w* N+ X
        }
, U& W) r' Q% F( W        2 V& G. W5 U) X: o4 c$ R
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: ^& S2 x1 Y4 K+ F/ G+ k

" z/ s9 A, J! O: V        while(1)
8 o. M* m) {' T        {
3 [$ _* P4 E8 D; e0 N# l, g+ D& F                read_MSG_buffer(mem);
, E" W& i7 z% C+ o- m        }                1 S4 m3 Q7 W# `# `0 ]
}( L1 C  A- K$ M/ k

8 |. z. ~$ }9 lvoid read_MSG_buffer(int *baseaddr)
1 o+ r" y+ V1 \* I8 E6 S# z. F{8 R! w# N' `6 P% `/ ~& }" `) K4 g6 x
        pRX_MSG_PROTOCOL pshreRAM = NULL;& d' Q  j4 j1 E$ F

6 T0 T4 Q: C9 q, w' p; ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! Y; Z7 A* k# ^' g" }# V2 w$ }3 Q9 O
        if(pshreRAM->packet_cout != count_copy)
% B7 Z7 w3 j$ ^- z$ }        {( v0 t- J; v' ?# p8 d: A  S! L& x
                printf("a is %d\n", pshreRAM->a);
  y: E6 r/ T7 \4 f                printf("b is %d\n", pshreRAM->b);  g  A7 l6 T# d$ C- ?  x
                printf("count is %d\n", pshreRAM->packet_cout);: }8 e: K* a5 _. G( H) b, J6 k
                count_copy = pshreRAM->packet_cout;* f3 V0 ^3 d+ F' T" C
        }+ w6 y6 y* M9 ~' P
        else
; c: u7 \- D  E* Z9 E        {
' J% l1 g4 k0 u8 Q! I: x                printf("No effective message!\n");9 y( q% v- ~% o. m$ r7 v
        }0 d" z5 ^0 }3 v% r7 j" g! M
}
+ T* ?) p1 V0 |" o& `4 W" Z7 L) o  q( {/ f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( Q7 J6 j$ y( L: L& H& G- s
, p- S2 o& C' e( O; x

4 a( w% t7 ^1 l. G. i/ [4 n
- |2 M; P' `' U8 U0 s3 j
) Q4 J: a! ^2 o4 D! _& X1 y6 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 14:02 , Processed in 0.035714 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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