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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% b2 s3 g  U: ~' s- P5 U7 m
0 D  c' W1 q- x" T; qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( g) z$ J: T+ n) w. E
#include <unistd.h>- `& I2 t( ~" y1 E* ]7 F! C
#include <sys/mman.h>
% q$ a$ j' a3 f& l7 J& D#include <sys/types.h>; q' h- Y) B. [2 d" [
#include <fcntl.h>- @4 s9 C& a7 v
5 V5 R3 F' B  n5 `+ O7 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ _! k; E! m1 \6 Z% c& b0 j) u5 D, K
% v; y! N, h& c" r5 {! k
typedef struct
* U+ I" |8 S- s' \, `, a. ^# r0 x{+ E, E' a/ {  P% Z
        unsigned int a;
4 D! W* d# o7 R. O3 @        unsigned int b;/ e4 n: h; c. |5 G
        unsigned int packet_cout;
( Z) y' [  W3 d- O* o; d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' j5 k. D) d, o9 X
) T5 E/ j% P1 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 K& ?0 j2 f# {  P) G
unsigned int count_copy = 0;
6 p; s( i4 u$ Z+ B, Z- s* u8 T( W
- \- L8 ]2 f5 B8 ?5 f) Z7 b2 h; _7 ]$ p4 Y0 s( O
int main()
- w. [: p0 L8 @- W; S' Q. L{
& Q! b$ u( B7 U, K, \* Y        pRX_MSG_PROTOCOL pshreRAM = NULL;+ ^# ~) d2 g& z! w! A8 E# E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; k- E4 y: u7 J: b
$ n2 U: Z! f3 a7 c/ @1 j        while(1)
2 ^$ ^( b8 ?  K: L6 d+ {- X2 |        {
! S( {3 }, L6 d* o                read_MSG_buffer(pshreRAM);
4 F! r  b2 S+ z# q1 u        }               
( F" ^0 p1 A0 o}
) _5 ^1 Z/ [2 k4 n/ r+ h3 e5 S: z# Y4 T1 E4 W; g& d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' H" ~9 n, z3 ?* s: X) }$ A
{
! `- \, k& c7 |$ m6 c        RX_MSG_PROTOCOL buf;
) F- Z2 d4 `! k) A0 V        
; A5 U9 w) B- W3 B* Z) `) q- v        buf.a = pshreRAM->a;% T8 _) B5 O6 D1 E# p
        buf.b = pshreRAM->b;! D4 k7 W0 R, q1 `6 h5 n
        buf.packet_cout = pshreRAM->packet_cout;* ?0 O* S; s) X1 _' q4 e2 d1 ~# Z
        
+ x5 p0 |' G/ [3 t! C        if(buf.packet_cout != count_copy)
( @  n4 b1 |% |9 [; |- B        {
( Y- R' l4 [! S; Y/ T                printf("a is %d\n", buf.a);
% t  W# S9 P8 F: w+ l: B2 c7 I                printf("b is %d\n", buf.b);
2 `+ g$ P# @6 q% L                printf("count is %d\n", buf.packet_cout);+ w& v# ~8 o5 m$ @+ o1 u( [
                count_copy = buf.packet_cout;
) c- ]; a. q$ B        }9 a9 `/ d- }3 X- s( Y) h: E% w$ E
        else; z  `5 @4 j. P0 L/ R  K
        {
( D5 W5 s3 I( E  A; M6 E/ ~                printf("No effective message!");) A8 r$ Q* h3 w* J. n
        }2 |  e: y4 J  i
}
: U& ?- b  ~( j3 e" x- d$ D) m8 P% t' Y0 Y2 t7 V" J" {

  q# x2 w* y# F! j* w9 k但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 f& w4 ~% s+ O6 i$ H7 ~使用下面代码,对内存使用了mmap函数后:1 v* V; ?% Z4 n% V0 q7 d  V
#include <stdio.h>! c; `  X1 T5 y2 O& [, m2 n
#include <unistd.h>7 \. V: x8 M, n) Q& p
#include <sys/mman.h>
1 @5 b7 y! a. z! x. B7 O#include <sys/types.h>
7 J0 e6 x/ \; d0 P* @& Q#include <fcntl.h>
' u- R; w* q- q4 L% ?0 Y; T/ C! k. G; g1 k
#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 X; z$ I$ o0 W$ ?#define SHAER_RAM_SIZE         (0x20000)   ! i" N- m3 Y  H( U& ~& J  A7 }
8 u5 O$ b- a" i0 l
typedef struct
. W$ j$ [+ Z- E5 j8 z{
4 y! C+ c7 Q! O  A/ x        unsigned int a;/ x3 I) L# }: b  N7 y
        unsigned int b;
1 ?7 H! C5 j* Q0 W* i- g" Z; j        unsigned int packet_cout;
0 ]4 _' m( Z4 f8 u# s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' S0 K2 T6 G0 k) L2 E
7 z9 g1 s& T* b  U7 z! k
void read_MSG_buffer(int *baseaddr);# H# J0 _0 R( {! w9 r  h5 g
unsigned int count_copy = 0;
! z3 x7 F" \) Z& ^) ?( |5 j. `+ z8 a& r, @  [1 }
int main()' D, d1 K8 F$ D8 e4 C
{: u" [% Y" @( X6 r$ V/ T
        int fd;, ~) _/ M' g9 E! r3 H1 }$ j
        int *mem = NULL;
9 i5 v) R" Z& ?2 _/ c+ k  ?+ I$ e  v; Q& n- X' h. ^
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 W- D0 N$ [7 f- \* \0 g        {
8 ?6 j$ y* X# f! R0 ^* Y                perror("open error");/ N" ?( k" u, h' q6 O* ]4 A
                return -1;
; M# S& J6 F; K        }& b* \8 }$ t6 c: s' l+ L3 U
        
& R+ I: F) s+ y0 Z% t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 i3 n3 X! ~& U

( u, {5 ~' R7 j        while(1)
# y6 W* G; e5 @2 N        {
  ?/ [- o7 [1 V! v9 G& p) N4 t4 m& Y                read_MSG_buffer(mem);' E/ p& O* M+ T: J* ~
        }                . q" p% z# w! G  X. G
}4 U% i8 M) i9 Q+ j& [

5 H( [$ E8 J5 _1 Z, k* [void read_MSG_buffer(int *baseaddr)
1 M8 U+ O9 z+ ]- x1 \/ L% H{
5 \/ i5 A; T1 w        pRX_MSG_PROTOCOL pshreRAM = NULL;3 @% N: G- t* h' L; }
" W# s- x) V  L, k+ C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ J8 h+ @' a1 W! [- `
8 r  y# z4 T' Q$ x& Y        if(pshreRAM->packet_cout != count_copy)& u8 t5 l# x! Z
        {
1 L! D# z. ~, _- W                printf("a is %d\n", pshreRAM->a);
8 T! B# J# R- ?                printf("b is %d\n", pshreRAM->b);* M+ p: B* u( j% m
                printf("count is %d\n", pshreRAM->packet_cout);
/ K) U- y) z( S1 |' n0 P1 b                count_copy = pshreRAM->packet_cout;
% {3 f1 i/ b) `. ]3 v/ ^        }, q5 E. h' k' [& O2 u0 r2 B
        else
- O5 O: I# `7 _! k5 t        {
7 l: k$ V. @) `. `* ^2 G% |8 Y. L                printf("No effective message!\n");
  m3 K9 ]) X" |        }
2 r+ R* F8 \3 n2 R2 r+ ^8 v9 J& ]}
- I) u! S  k0 w  y9 A
, a$ q3 H; [$ \! p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) g( f& g+ E$ n  n  D
3 C0 M% X- P. N  E
( K$ }% N) u5 Y% W! H2 `0 U( M4 `/ H
$ C5 c0 \0 y# g! Z! K/ I3 [8 [! }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 18:34 , Processed in 0.044744 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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