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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   V6 e+ w% f% y- `6 C9 u, b

* C1 ?, a" b% p% COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  c: u, m! K2 S4 x#include <unistd.h>/ a  A1 i! e& d
#include <sys/mman.h>
3 m) t" E6 b( R. T  f3 Q8 ?* f#include <sys/types.h>
# h6 R. m4 Q) ^; _) {#include <fcntl.h>
7 f  z: V  O* K; o- T) b/ o+ L( D
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' I7 Q5 m+ o) }: T

6 V3 S# A" }' q4 E- Btypedef struct8 K( }+ Y1 Q" u* y+ Q
{
0 k' i. h+ p& S4 Z8 l5 @        unsigned int a;
& s* c& ^" ?6 j2 F' U        unsigned int b;8 j2 ?6 w0 D  i: r3 c+ R( ~) N9 u
        unsigned int packet_cout;1 n" ^+ w; A+ w( k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% N1 ?, }1 ], x1 |0 I+ i' p8 M  M

' F4 i8 ?; V( [) y: D; w- Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 x5 V# L+ X8 w$ H( j1 [. f
unsigned int count_copy = 0;% Y. C% i$ t" C- l
- D4 A6 P: f1 L0 o+ H
  Y. O+ a- W; c- n* J
int main()
7 l9 C3 E8 C" T0 t: s9 A{
2 w" k0 i, F% C; T1 y, ~0 G7 D& m        pRX_MSG_PROTOCOL pshreRAM = NULL;
: x/ m, [: H8 g  i2 i, J8 C' R/ `        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( A6 w9 X; {6 c3 d
* V0 c& p8 `: G: e
        while(1): {" q3 b  |" L9 j
        {
, g; S) e% _& o# e0 m: }6 Y                read_MSG_buffer(pshreRAM);
# m- d$ x& w# I6 M$ @& q% t! w' U        }               
: G6 r4 k7 W( @& z}
2 m+ E% l+ E: p; |0 {6 b# w" s2 c
7 F2 X1 {: s: k1 y% ?, M# h* }) F& `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  M! w4 L4 \" K& W{; m9 ]0 [" s9 W8 l0 X" m+ O
        RX_MSG_PROTOCOL buf;8 O* w- W0 G. s5 e( a
        
* ]6 H. H, c3 K( H; V2 x; I* n5 f        buf.a = pshreRAM->a;) j* ?% W- t5 L& A6 m& y7 j
        buf.b = pshreRAM->b;! ?7 W4 I, u$ F
        buf.packet_cout = pshreRAM->packet_cout;: @# l( d* W( {( P; \  P7 l- m1 ^
        7 M& K) |, Q5 R
        if(buf.packet_cout != count_copy)
) |( r  d7 r8 p8 [/ D/ V7 ~% P' e8 j        {
/ l3 K$ `4 u  r' K( u: M                printf("a is %d\n", buf.a);8 A8 `( F4 \$ U( r% |. `
                printf("b is %d\n", buf.b);
% n! x+ a8 r, }) ~0 p& N" H                printf("count is %d\n", buf.packet_cout);* ?& a" \* Q' `: _+ a6 E
                count_copy = buf.packet_cout;2 Z! V. m$ N7 {$ I, E% w, c
        }
7 Y+ ^4 o3 Y7 r# k  i- m        else
; Y6 ^; e8 F+ f4 S. r8 L4 k* w4 J        {" E% Q( R# l0 E2 a& r1 k) U
                printf("No effective message!");# ?) e. @) c, G+ r
        }
  k! n) ^* Q- g/ b3 s, g7 @}% X8 S! O# S, Y% p
( b7 Y: w$ k) e) `6 s4 Q9 `

7 s; b# U+ I( M但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- q. O3 H9 \7 A9 J. M& h使用下面代码,对内存使用了mmap函数后:& [$ g* ^6 E) t. S5 U9 d
#include <stdio.h>2 L1 m. I2 G. k! o7 s- f) J
#include <unistd.h>9 d# r: h/ f, d$ D- Z
#include <sys/mman.h>
' {- ^! c# r1 j3 ~- _: L#include <sys/types.h>* D9 g/ u: U: s) `) H$ {
#include <fcntl.h>
/ ]; e7 N5 {9 k9 Q
6 M/ e% m# o# M  d! M1 s* v$ U#define SHAER_RAM_BASE_ADDR    (0x80000000)1 m) M4 h- r# ^2 A6 K: `- V
#define SHAER_RAM_SIZE         (0x20000)   
1 W9 b4 X; D. B# T* E* M' b2 U* T2 P+ f& m6 \, H3 f( H; y5 a
typedef struct# u0 x; o; K8 `" T: i7 L1 N
{" o: e; f7 U5 Q! a0 y8 v! G9 i
        unsigned int a;
$ \/ |) T/ D5 V0 H7 }" J9 i' _) ~        unsigned int b;5 w) \  ^0 s& h: `; }. J) \) A
        unsigned int packet_cout;
4 A( v4 O# u: U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# k  r6 w# v/ `6 `1 J/ ~5 Y  D6 A2 q! {) N. S2 ?" m
void read_MSG_buffer(int *baseaddr);
7 ~" x; S' d# t  zunsigned int count_copy = 0;: E3 \, ~( O( _- s

& M1 ^/ X7 @; ]( |1 u& l2 U  rint main()
  d+ u' V" u2 U& L2 B, u{
" s/ }3 @1 G) Q5 b        int fd;
+ {8 \3 d7 N4 v        int *mem = NULL;
7 c1 d( ]3 p6 O: {! w8 P/ y+ H2 P4 c6 E2 }& q# c
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 N4 S& k1 F3 c( b% Z$ V$ R        {
, A' V- @$ ?8 q7 @& X                perror("open error");
! b4 D7 f' E( N9 a; a+ |+ T# T/ q                return -1;
* j, B2 I6 B7 h, J  p        }
/ P. ]" B& a3 z          z% z9 D4 Q  L& v) h- v/ `
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; P9 z, p- G5 O4 U4 T

, z4 `* ~  A4 f" b# z- ]        while(1)" i% Y2 |+ D7 Z4 a6 h/ f) z
        {  d6 Y. h6 W3 n& ]( u8 Y
                read_MSG_buffer(mem);
1 ~- Y. h. f- f1 F5 E8 J8 q1 l" O        }                + N9 k- \  D& W$ y
}) G$ S: a+ }$ z9 K; [) U/ s
2 _, A+ @* E  l# O% y( G3 Q
void read_MSG_buffer(int *baseaddr)
$ @6 o/ r. H$ p( s6 ?" d# c{
( I0 S1 p! f7 s8 b+ `/ P        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ~; P4 p, @7 h9 [& ~
9 ~7 I: m& w  c+ x( z; s3 |        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: ]4 O& C" d6 I2 Z; m9 E6 U$ S. z
. F9 ~+ W% m; ?
        if(pshreRAM->packet_cout != count_copy)* \) X1 ~3 Z& z2 @! C
        {
/ m' Z3 c, r. y3 _8 X                printf("a is %d\n", pshreRAM->a);
" a0 T. h: d0 R( ?                printf("b is %d\n", pshreRAM->b);) `# A+ Y2 a' v) L7 u% p
                printf("count is %d\n", pshreRAM->packet_cout);3 {& |$ z* S% @! V6 s$ u
                count_copy = pshreRAM->packet_cout;
) A7 `5 c! W% P# _* P        }
$ t4 y* B9 }% E        else
; K& {+ w: ^, T- O; G2 y+ C        {- c: ?% I% {+ T' F; F
                printf("No effective message!\n");
  c+ n/ J; W3 m# u5 ^' i1 j        }6 A  y, m0 b" R6 ]. Q
}/ |0 t- ?0 a$ [" J: Y

+ E3 f6 M) t7 Q1 F' B- z9 h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( `# c! P' Q, B7 |  {
$ _9 v/ E. l( b8 W; n
7 _5 p6 N& `1 M2 i7 ~' l" w
0 L) h- W6 q2 g5 _/ ]5 `+ {6 r& D

' k2 S1 G& Y% `* s/ X4 y8 M! I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-26 05:30 , Processed in 0.047071 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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