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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' t+ V: O/ e+ x2 P) U

$ e1 n; l0 e1 gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: p2 j3 W. r, I9 _, g#include <unistd.h>
7 H! }( C! I6 e% ^% A" h$ [#include <sys/mman.h>$ ^) `6 c$ J2 i+ R7 A
#include <sys/types.h>+ U2 Z/ o5 K) G: Z7 ~
#include <fcntl.h>
9 W5 p+ k" X7 R8 g
+ b+ [1 s& b9 N: D( R#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 }4 p6 L6 s/ ^8 ]8 o* G* m! M
8 g: }/ t/ Q" m2 T4 B7 K
typedef struct6 w$ S5 t$ j! K. W8 a2 R( \" _9 Q+ U
{
8 i, D0 I- p; c5 U$ R        unsigned int a;6 k" [4 p+ ?* s6 K
        unsigned int b;
. A+ H! M) X& ^        unsigned int packet_cout;: ^/ n  B  }( k) n8 w2 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& ~! J2 V+ ]- k! T# z8 V

9 p2 x2 d+ |; v. c. pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# ~  v; x- V1 T3 v: {3 ^% V
unsigned int count_copy = 0;
2 z, E; }. A1 E) V5 }# `" Z- k

) d" X2 d  h+ w" S5 [: @int main()+ \, I, A  ^; L, A4 t
{6 K0 r/ F+ p  }' V; e3 L, }
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% v$ C. H$ T/ X. i3 M" X* p        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. T5 m5 E, n" e0 O5 j+ z! |
' {* b# m4 Z9 o$ v* M+ _
        while(1)/ L4 n" n: n5 t  m' \( C2 {
        {
: b/ D" |4 G) A4 Z8 x                read_MSG_buffer(pshreRAM);  l* R: P2 @, i+ B+ G& `! U
        }                1 {/ y7 s! k1 P# L  G+ @
}$ A% _2 `- a( {) g6 C
8 s3 o; e$ {% J! M0 y% s) w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ }5 Q1 \5 \8 K( y, S- V
{- N! f7 D% G9 z
        RX_MSG_PROTOCOL buf;, z9 e4 U* u; e. t
        
+ F/ @9 H' O, A( c; v& T- R        buf.a = pshreRAM->a;
7 @. `& \; V. _' {+ J        buf.b = pshreRAM->b;5 k/ K( l7 t' ^$ }3 n* ~
        buf.packet_cout = pshreRAM->packet_cout;  n& e, ^% J" F# a# y
        4 u0 z* ~# e: x  \
        if(buf.packet_cout != count_copy)
/ m- f; O7 `. f/ v        {
8 [( U* `3 _' [. p                printf("a is %d\n", buf.a);
+ \! B1 `8 F8 m                printf("b is %d\n", buf.b);
9 s: i( \) j3 D& M( D                printf("count is %d\n", buf.packet_cout);* v0 B8 o7 R3 T* c% v% L; P; w* [# |
                count_copy = buf.packet_cout;
, r4 f3 H+ R# Y" K0 O$ u        }
7 \9 i, }6 }7 I" ]7 E1 h        else& J, [, b# S) _1 v" p
        {$ L' I* c; {+ p: J' J+ J5 f# I" [( j
                printf("No effective message!");
" Z  q" V& @/ U0 f2 n        }
8 [0 S$ g0 n  y* s}
3 S3 c4 }8 `- F; p! O3 f' @- J0 j3 q
& M( S% L8 E  t5 G# ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 H* v( o- W; Y: ?使用下面代码,对内存使用了mmap函数后:
% N8 z# G) |* H$ @% X$ Y9 f' V1 v#include <stdio.h>) u3 P4 Q4 c0 G
#include <unistd.h>
& A* u5 A# S$ {4 o6 K#include <sys/mman.h>& O* I( m; [- a7 L; z* {
#include <sys/types.h>
" p8 W6 ^& C( _$ y8 H#include <fcntl.h>/ k! |, {( \+ ~8 S1 C! c' L

3 k+ @+ M0 v7 X4 J  l4 s#define SHAER_RAM_BASE_ADDR    (0x80000000)
) w, h( d# q' `1 [2 c5 o6 x#define SHAER_RAM_SIZE         (0x20000)   1 x8 p" R7 C, O' Q" o

5 {; c4 J) _2 A3 d- i; Ftypedef struct
& ~& z% S" s' d% x  T! K" i, w, q{
: [  f) m2 ?8 K        unsigned int a;
- f' L+ J6 j% S) J        unsigned int b;0 P( d3 u& a! o
        unsigned int packet_cout;
) x4 ?! A) x6 j& q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) I" }; Q7 t0 Y$ h# z6 u6 [' \& n3 b! c' o" p& W0 g$ H8 ~
void read_MSG_buffer(int *baseaddr);9 c: R( o9 T" M4 v8 D( d
unsigned int count_copy = 0;- m3 P: A# D: ^5 m. H5 m
( L5 p. I; L; q8 T& x, V- \/ j- b
int main(), Q) f# ?, I& p, _6 m- x
{
4 ?/ Y+ @) j. U        int fd;
' d) W3 ]# Q, J) G# G- H        int *mem = NULL;! B2 n8 r+ o) i. X+ m! P

5 _7 y2 e6 d/ q9 X+ l5 |* D; y        if((fd = open("/dev/mem", O_RDWR)) <0)
5 K4 E+ B& b. d1 Z. {- ?- L' O        {+ c5 g5 k! L( M( p. P
                perror("open error");( [$ s8 A% J) Q. v( J. X0 G& `
                return -1;2 n) T2 `8 F, L  D
        }2 Q2 l3 R7 Y  [, u4 {4 U2 B7 C; d
        0 H+ K& F- k! g5 r% l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 X2 R/ m* j3 C6 K# K. I3 D# S
4 x" K6 R5 x9 a
        while(1)5 j0 S, X7 `* Q( N. U4 S5 Z
        {
+ r% h0 _  h0 U% H! Z. r3 x                read_MSG_buffer(mem);
6 |2 b4 T$ F- `        }                2 p" [. L3 U& {
}' w. A7 {* I$ b* `2 n( k* D
& M" u: ^; S& g+ M( m
void read_MSG_buffer(int *baseaddr)
( |# O0 O# u6 m7 a3 f% S{
& R$ I. P9 t. A! z  G  Y- j        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 t- E: m6 |  Z! N* U# P
  D7 n( v& b5 o5 e- |8 l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 o: Z& i/ d6 k% c( `7 [) ~5 r; @  o: i
        if(pshreRAM->packet_cout != count_copy)' i5 e# h# r  _/ \
        {
' J; e% `/ ~& W1 T" U0 _                printf("a is %d\n", pshreRAM->a);
; T/ Z  u. B& s; {                printf("b is %d\n", pshreRAM->b);  O4 C5 I* x$ g, Q. q
                printf("count is %d\n", pshreRAM->packet_cout);
1 x; P+ Z5 j# T8 j                count_copy = pshreRAM->packet_cout;
- Z% Z) j- ~; i8 a* _3 y$ z        }
: T' |$ Y3 B" r: N+ p, b+ v: v6 f        else/ w9 ~: S0 r5 X
        {
' W  b+ k" Z. V$ {( h                printf("No effective message!\n");
# s- z* h. f* [# W" V1 j) ~        }
. |, ~" k3 B9 ^5 f0 }3 k0 L}
/ H3 i, j- U, G# d, ~$ z$ N7 }% ~3 p# k& L+ X) u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 o8 l; K% g$ X4 H% Q8 y7 W) {
8 i; T1 E: E+ j/ W: d, P" N- O8 ]

! S3 Y1 P/ S+ @$ K2 L8 u7 q; Y7 M- J. ^0 v5 D( y5 Y

, q3 \% s0 E$ \9 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 21:02 , Processed in 0.041851 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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